放置new以推迟到不同的构造函数

Jon*_*ney 11 c++ placement-new

这样安全吗?我在实际实现中没有使用任何虚函数,但我很想相信即使我是,它仍然是安全的.

class Foo
{
    Foo()
    {
        // initialize things
    }

    Foo( int )
    {
         new ( this ) Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

Ash*_*ain 13

当你输入Foo(int)构造函数的开放花括号时,所有类成员都调用了它们的构造函数.如果然后强制调用另一个带有placement new的构造函数,那么你将覆盖该类的当前状态.这基本上意味着所有成员都有两次调用它们的构造函数 - 如果new它的构造函数中存在某些东西,那么你会泄漏那些内容,而你真的会把事情弄得一团糟! 您正在有效地构造两个对象,并且永远不会调用第一个对象的成员析构函数,因为第二个对象会覆盖第一个对象的内存.

换句话说,它很糟糕!不要这样做!!

最常见的解决方法是使用某种初始化函数,并从两个构造函数中调用它.但是,这不会让您初始化const成员和必须位于初始化列表中的其他成员.