显式构造函数调用

时间:2011-05-26 17:26:25

标签: c++

我想知道是否存在某种使用对象指针显式调用构造函数的技巧。如果这是一个合法的语法,它将如下所示:

Foo *p = malloc( sizeof(Foo) );

p->Foo::Foo();

P.S。我知道我可以做Foo *p = new Foo();但是有明确的理由明确使用malloc()。

5 个答案:

答案 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();

您可以在wikipedia's article about it

了解更多信息

答案 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;
    }