在 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++ 中,struct
与 class
相同,只是它具有默认的 public
成员,以及默认的 public
继承。
至于malloc
的使用,虽然可以使用,但正如你所说的C
型分配,不应该用于C++
。如果必须,您可以使用 malloc/free
对结构和类使用相同的方式。
但是,正确的C++
方式是使用new
和delete
,struct
和class
的使用方式相同。
如果您对为什么应该使用 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】:
你误解了struct
s。
然而,“Current”在这里是一个结构而不是类,但在 C++ 中是受支持的
错了。 Current
是一个类。如果您使用关键字 class
而不是关键字 struct
声明它,它也将是一个类。
提供关键字struct
是为了向后兼容,使用它会更改定义语法中的一些可见性默认值。但是,否则,您仍然只是定义一个类。
当然,使用 struct
定义的类没有什么神奇之处,这意味着您应该回到古老的 C 风格分配。
【讨论】:
以上是关于在 C++ 中,结构上的“new/delete”代替“malloc/free”有多好?的主要内容,如果未能解决你的问题,请参考以下文章
C++ 中的 new/delete 和 new[]/delete[]深入理解