与new和delete运算符不同,malloc在创建对象时不会调用构造函数。在这种情况下,我们如何创建一个对象,以便也可以调用构造函数。
答案 0 :(得分:64)
呃...使用new
?这就是重点。你也可以明确地调用构造函数,但没有理由这样做
A* a = new A();
delete a;
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;
}