Malloc和构造函数

时间:2010-06-08 06:02:46

标签: c++

与new和delete运算符不同,malloc在创建对象时不会调用构造函数。在这种情况下,我们如何创建一个对象,以便也可以调用构造函数。

7 个答案:

答案 0 :(得分:64)

呃...使用new?这就是重点。你也可以明确地调用构造函数,但没有理由这样做

正常使用new / delete:

A* a = new A();

delete a;

显式调用构造函数/析构函数("placement new"):

A* a = (A*)malloc(sizeof(A));
new (a) A();

a->~A();
free(a);

答案 1 :(得分:15)

如果您确实需要,可以使用“placement new”语法来执行此操作:

MyClassName* foo = new(pointer) MyClassName();

其中pointer是指向分配的内存位置的指针,该内存位置足以容纳对象的实例。

答案 2 :(得分:4)

首选new

但是如果由于某种原因你有原始内存,你可以使用“placement new”构建它:

new (ptr) TYPE(args);

由于你不会使用删除,你需要直接调用析构函数:

ptr->~TYPE();

答案 3 :(得分:4)

使用placement new。这个建议很方便:

  

建议:不要使用此“放置新”   语法,除非你必须。仅使用它   当你真正关心一个物体的时候   放在特定的位置   记忆。例如,当你的   硬件具有内存映射I / O计时器   设备,你想放置一个时钟   对象在那个记忆位置。

答案 4 :(得分:4)

你误解了malloc的作用。 malloc不创建对象,它分配内存。因为它不创建对象,所以没有对象可以调用构造函数来创建。

如果需要在C ++中动态创建对象,则需要使用某种形式的新对象。

答案 5 :(得分:3)

查看placement new运算符,它在预分配的缓冲区上构造一个对象。

答案 6 :(得分:-4)

class A
{
    public:
      A() { printf("Constructor of A"); }
};

int main()
{
   A* pA = (A*) malloc(sizeof(A));  // Construtor is not going to be called.

   __asm { MOV EAX, pA}             // Makes pA as "this" pointer in intel based s/m.

   A();                             // Calling constructor explicitly.

   return 0;
}