我想知道是否存在某种使用对象指针显式调用构造函数的技巧。如果这是一个合法的语法,它将如下所示:
Foo *p = malloc( sizeof(Foo) );
p->Foo::Foo();
P.S。我知道我可以做Foo *p = new Foo();
但是有明确的理由明确使用malloc()。
答案 0 :(得分:17)
您可以使用“placement new”运算符:
Foo *buf = malloc( sizeof(Foo) );
Foo *p = new (buf) Foo();
答案 1 :(得分:9)
使用展示位置新:
Foo* p = new(malloc(sizeof(Foo))) Foo;
(在此省略任何内存不足检查)
基本上,new(address) Foo()
在Foo
指向的位置构造一个address
类型的对象,换句话说:它调用构造函数。
答案 2 :(得分:3)
您可以使用placement new在某个地址构建新对象。
void *buf = malloc(sizeof(Foo));
Foo *p = new (buf) Foo();
了解更多信息
答案 3 :(得分:3)
其他人已经指出你可以使用贴身新品。如果您希望类的某些特定对象在使用malloc
分配的内存中,则此方法很有效。正如已经指出的那样,当你这样做时,你需要明确地调用dtor。
如果您希望类的所有对象都在使用malloc
分配的内存中,则可以为该类重载operator new
(和operator delete
),并让他们调用malloc
来获取原始内存。这减轻了客户端代码单独分配/初始化的额外步骤。
如果希望集合中的所有对象(或多个集合)都在使用malloc
分配的内存中,则可以为集合提供分配器以实现此目的。同样,这减轻了处理分配的客户端代码,并使容器看起来,行为和“感觉”像普通容器一样。
答案 4 :(得分:0)
struct MyClass
{
MyClass()
{
std::cout << "ctor" << std::endl;
}
~MyClass()
{
std::cout << "dtor" << std::endl;
}
};
int main(int argc, char *argv[])
{
// Allocate memory and call constructor
MyClass myObj;
// Call constructor again with placement new
new (&myObj) MyClass;
}