为啥在malloc中不调用构造函数? [复制]
Posted
技术标签:
【中文标题】为啥在malloc中不调用构造函数? [复制]【英文标题】:Why constructor is not called in malloc? [duplicate]为什么在malloc中不调用构造函数? [复制] 【发布时间】:2015-05-21 13:11:07 【问题描述】:为什么在 c++ 中使用 malloc
和 free
时不调用构造函数/析构函数,而在使用 new
和 delete
时调用构造函数/析构函数?为什么会这样?
【问题讨论】:
是什么让你想到构造函数应该在malloc
中调用?
相关:What is the difference between new/delete and malloc/free?
malloc
怎么会知道调用什么构造函数?不用管什么参数来传递它。
【参考方案1】:
malloc
和free
纯粹是内存管理 函数,它们对类一无所知(并且早在C++ 之前就存在了)。它们是低级内存操作。
C++ 向 C 中添加了类,并且作为该过程的一部分,添加了 new
和 delete
以创建和销毁类的实例。这与低级内存管理不同。
【讨论】:
如果没有像你说的那样创建对象,那么为什么这段代码有效: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中不调用构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章