在下面的代码中,sub
类中的对象C
被构造了两次。第一个构造调用默认 ctor Sub()
,第二个构造用于placement new
在同一地址重建此对象。
因此析构函数也被调用了两次。第一次调用使用对Sub
dtor in的直接调用~C()
,第二次调用是main()
在atexit()
函数结束后调用的。
鉴于对象sub
是在同一地址重构的,编译器如何知道必须在之后调用第二个析构函数main()
?他将这些信息保存在哪里?
#include <iostream>
using namespace std;
struct Table
{
int i;
Table(int j) : i(j) {}
};
struct Sub
{
Table* pTable;
Sub(int j) { cout << "ctor placement new" << endl; pTable = new Table(j); }
Sub() { cout << "ctor default" << endl; pTable = 0; }
~Sub() { if( pTable ) cout << "dtor placement new" << endl;
else cout << "dtor default" << endl;
delete pTable; pTable = 0; }
};
class C
{
Sub sub;
public:
C() { new (&sub) Sub(10); }
~C() { (&sub)->~Sub(); }
};
int main()
{
C c;
}