在C ++中,假设我为同一个对象调用了两次构造函数。然后编译器分配内存两次还是只分配一次?它甚至合法吗?
答案 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 后引发异常会怎样?
对于具有非平凡析构函数的类类型的对象,程序不需要在重用或释放对象占用的存储之前显式调用析构函数;但是,如果没有对析构函数的显式调用或者如果没有使用delete-expression来释放存储,则不应该隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都有未定义的行为。 / p>
2)答案:[basic.life]/9
。