Malloc和构造函数

ckv*_*ckv 27 c++

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

Mic*_*zek 69

呃......用new吗?这就是重点.您也可以显式调用构造函数,但没有理由这样做

正常使用new/delete:

A* a = new A();

delete a;
Run Code Online (Sandbox Code Playgroud)

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

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

a->~A();
free(a);
Run Code Online (Sandbox Code Playgroud)

  • 您还应该提到在使用placement new时需要显式调用析构函数,而不是使用"delete"来销毁析构函数. (16认同)

war*_*enm 16

如果你真的需要,你可以使用"placement new"语法来做到这一点:

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

where pointer指向分配的内存位置的指针大小足以容纳对象的实例.

  • @RSamuel:我通常会在极少数情况下这样做,我需要新的位置.我确保将`pointer`视为内存并通过`new`获取对象.它也"隐藏"演员. (3认同)
  • `foo`和`pointer`可以是不同的类型,或者`pointer`可以是计算偏移到更大的内存块的表达式. (2认同)

R S*_*hko 5

更喜欢new

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

new (ptr) TYPE(args);
Run Code Online (Sandbox Code Playgroud)

并且由于您将不使用delete,因此您需要直接调用析构函数:

ptr->~TYPE();
Run Code Online (Sandbox Code Playgroud)