为同一个存储位置调用两次构造函数是否合法?

时间:2018-03-20 18:46:45

标签: c++ constructor language-lawyer

在C ++中,假设我为同一个对象调用了两次构造函数。然后编译器分配内存两次还是只分配一次?它甚至合法吗?

1 个答案:

答案 0 :(得分:1)

只要您还调用析构函数,就可以在同一个已分配的存储上多次调用构造函数。但是不要这样做。我认为这是一个纯粹的理论问题:

struct Object { virtual ~Object() {} };
{                                 // some scope
    Object obj;                   // constructed on automatic storage location
    obj.~Object();                // destructed
    new (&obj) Object;            // new object constructed on same storage
}                                 // destructor automatically called

跳过手动破坏可能会导致具有非平凡析构函数 1 的对象的未定义行为。注意这是要求麻烦;作为练习:如果在obj被手动销毁并且obj已被手动重建 2 后引发异常会怎样?

1) [basic.life]/5

  

对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放对象占用的存储之前显式调用析构函数;但是,如果没有对析构函数的显式调用或者如果没有使用delete-expression来释放存储,则不应该隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都有未定义的行为。 / p>

2)答案:[basic.life]/9