为啥在malloc中不调用构造函数? [复制]

Posted

技术标签:

【中文标题】为啥在malloc中不调用构造函数? [复制]【英文标题】:Why constructor is not called in malloc? [duplicate]为什么在malloc中不调用构造函数? [复制] 【发布时间】:2015-05-21 13:11:07 【问题描述】:

为什么在 c++ 中使用 mallocfree 时不调用构造函数/析构函数,而在使用 newdelete 时调用构造函数/析构函数?为什么会这样?

【问题讨论】:

是什么让你想到构造函数应该malloc中调用? 相关:What is the difference between new/delete and malloc/free? malloc 怎么会知道调用什么构造函数?不用管什么参数来传递它。 【参考方案1】:

mallocfree 纯粹是内存管理 函数,它们对类一无所知(并且早在C++ 之前就存在了)。它们是低级内存操作。

C++ 向 C 中添加了类,并且作为该过程的一部分,添加了 newdelete 以创建和销毁类的实例。这与低级内存管理不同。

【讨论】:

如果没有像你说的那样创建对象,那么为什么这段代码有效:class Test public: Test() cout 你好();免费(t2);返回0; " @T.J.克劳德 @SarahIrfan:因为非虚拟方法调用的机制让编译器可以正确解析方法地址,而无需正确初始化对象。并不意味着你应该依赖它,也不意味着它是正确的。底线:如果您想正确创建对象,请使用new【参考方案2】:

malloc 是一个早于构造函数的 C 函数。 free 是一个早于析构函数的 C 函数。它们都是 C 函数,必须在没有构造函数和析构函数的语言中运行。

【讨论】:

但是当我们使用 malloc (for a class) 时会创建一个类的新对象,所以它必须执行该类中的所有函数,包括构造函数和析构函数。 @SarahIrfan: “当我们使用 malloc(对于一个类)时,会创建一个类的新对象” 不,它不是。可能分配了相关大小的内存,但尚未创建对象。 @SarahIrfan 不,一个新对象没有创建。这就是我想说的。要创建它,必须调用它的构造函数。 @SarahIrfan 不是“必须”不是。它“必须”做标准所说的 malloc 应该做的事情。 @juanchopanza 但是当我们创建一个指向类的指针,并将它指向所需大小的内存时,这是否意味着我们实际上已经创建了该类的对象? malloc(sizeof(class_name)) 返回分配的内存的地址,但是当我们将此内存分配给类的指针时,应该意味着已经创建了一个对象。您如何定义“创建对象”?

以上是关于为啥在malloc中不调用构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?

为啥在我的代码中调用复制构造函数而不是移动构造函数?

为啥在按值返回时总是调用复制构造函数

为啥这段代码试图调用复制构造函数?

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

将右值按值传递给函数时,为啥不调用复制构造函数