c ++中new和malloc之间的区别[重复]
Posted
技术标签:
【中文标题】c ++中new和malloc之间的区别[重复]【英文标题】:differences between new and malloc in c++ [duplicate] 【发布时间】:2017-09-02 12:19:25 【问题描述】:#include <iostream>
#include <cstdlib>
using namespace std;
class Box
public:
Box()
cout << "Constructor called!" <<endl;
void printer(int x)
cout<<x<<" printer"<<endl;
~Box()
cout << "Destructor called!" <<endl;
;
int main( )
Box* myBoxArray = new Box[4];
Box* myBoxArray2 = (Box*)malloc(sizeof(Box[4]));
myBoxArray2->printer(23);
*myBoxArray2;
*(myBoxArray2).printer(23);
return 0;
问题很简单,当我使用“new”时,构造函数被打印出来,但是当我简单地取消引用指向myBoxArray2
的指针时,构造函数没有被打印出来,printer
的函数也没有被打印出来。
还有为什么当我使用->
时功能打印机运行,但当我使用等效的*(myBoxArray2).printer(23)
时却没有运行
【问题讨论】:
您对malloc()
的使用在这里无效。类实例必须在堆栈上或通过new
分配。当您使用 malloc()
时,不会调用任何 C++ 机器。
myBoxArray2
只是一个指向一些内存空间的指针,它的大小是——好吧,是无关紧要的东西的大小。即使您将myBoxArray
复制到该空间中,它也永远不会调用构造函数,因为 - 等待它 - 它没有被构造。
【参考方案1】:
malloc
只分配内存,它不会调用可以使对象处于不确定状态的构造函数。
在 C++ 中,您几乎应该从不使用malloc
、calloc
或free
。如果可能的话,也避免使用new
和new[]
,而是使用对象实例或实例向量。
至于您的第二个问题(与第一个问题实际上无关),*(myBoxArray2).printer(23)
是错误,因为.
选择运算符的precedence 比取消引用运算符*
更高.这意味着首先您在无效的指针上使用 .
成员选择器,并且您尝试取消引用 printer
返回的内容,这也是错误的,因为它不返回任何内容。
你想要(*myBoxArray2).printer(23)
(注意星号的位置在括号内),它与myBoxArray2->printer(23)
完全相同。
还要注意myBoxArray2->printer(23)
与myBoxArray2[0].printer(23)
相同。
【讨论】:
【参考方案2】:不同之处在于 malloc 分配内存时根本不对其进行初始化。另一方面,new
调用适当的构造函数来初始化该内存(如果该构造函数用于初始化该内存)并执行其他操作以使类可用。
还有delete
为你调用析构函数。
经验法则是:切勿将malloc
与 C++ 一起使用,除非您知道自己在做什么。
【讨论】:
除非你真的知道自己在做什么(以及为什么这样做)——因此构造函数是 new。 即使您知道自己在做什么,您仍然应该可能不要这样做。编译器可能会假设这些对象是如何初始化的,因为优化和违反这是“未定义行为”的快速票。以上是关于c ++中new和malloc之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章