在 C++ 中,结构上的“new/delete”代替“malloc/free”有多好?

Posted

技术标签:

【中文标题】在 C++ 中,结构上的“new/delete”代替“malloc/free”有多好?【英文标题】:How good is "new/delete" on struct in place of "malloc/free", in C++? 【发布时间】:2015-04-05 16:57:59 【问题描述】:

很多时候,我在 C++ 代码中看到结构的指针分配为;

struct Current
int amp;
;

Current *cur = new Current();

但是,“Current”在这里是一个结构而不是类,但在 C++ 中受支持。用它来代替 C 类型分配有多好,如下所示:

Current *cur = (Current*) malloc (sizeof(Current));

这背后的基本概念是什么?我知道的是,“结构”在 C++ 中被视为“类”。

C++ 中 struct-VS-class 的概念是已知的。查询主要是关于特定用例的,因为两者都是允许的,但应该优先考虑哪个,为什么?

【问题讨论】:

C/C++ Struct vs Class 的可能重复项 What are the differences between struct and class in C++?的可能重复 在 C++ 中,建议使用 new/delete 而不是使用 malloc()/free(),即使对于结构(与类相同,除了成员变量默认是公共的) 结构/类,真的一样。无论如何,你为什么首先使用动态分配?你确定你需要它吗?通常不熟悉 C++ 的人喜欢无缘无故地使用 new 关键字。这就是为什么它被称为new。它是newbie 的缩写。 【参考方案1】:

在 C++ 中,structclass 相同,只是它具有默认的 public 成员,以及默认的 public 继承。

至于malloc的使用,虽然可以使用,但正如你所说的C型分配,不应该用于C++。如果必须,您可以使用 malloc/free 对结构和类使用相同的方式。

但是,正确的C++ 方式是使用newdeletestructclass 的使用方式相同。


如果您对为什么应该使用 new/delete 而不是 malloc/free 感到好奇,我建议您参考这个 Q/A:In what cases do I use malloc vs new?


就括号的使用而言,即:

Current *cur = new Current();
//vs.
Current *cur = new Current;

看到这个:Do the parentheses after the type name make a difference with new?

我只是做了自己,并且学到了一些新东西。

【讨论】:

New 也调用构造函数,与 malloc 相反 括号在这种情况下实际上有所不同。 您能否详细说明为什么括号 @LightningRacisinObrit 没有任何问题?看来你可能是对的。但我不确定这是为什么。 new Current() 会将 amp 初始化为 0,而 new Current 不会。括号实际上更好。 @swalog 说不应该使用它们是错误的。在这种情况下,使用它们会导致 amp 的零初始化。没有它们,amp 将保持未初始化状态。【参考方案2】:

你误解了structs。

然而,“Current”在这里是一个结构而不是类,但在 C++ 中是受支持的

错了。 Current 一个类。如果您使用关键字 class 而不是关键字 struct 声明它,它也将是一个类。

提供关键字struct 是为了向后兼容,使用它会更改定义语法中的一些可见性默认值。但是,否则,您仍然只是定义一个类。

当然,使用 struct 定义的类没有什么神奇之处,这意味着您应该回到古老的 C 风格分配。

【讨论】:

以上是关于在 C++ 中,结构上的“new/delete”代替“malloc/free”有多好?的主要内容,如果未能解决你的问题,请参考以下文章

c++基础_ new, delete概述及其使用!!

C++ 中的 new/delete 和 new[]/delete[]深入理解

C++ 中的 new/delete 和 new[]/delete[]深入理解

C++ 动态内存 new/delete用法

C++ new delete操作符

Effective C++笔记(11)—定制new和delete