【发布时间】:2012-02-12 13:03:27
【问题描述】:
在下面的代码中,C 类中的对象sub 被构造了两次。第一个构造调用默认 ctor Sub(),第二个构造使用 placement new 在同一地址重建此对象。
因此,析构函数也被调用了两次。第一次调用使用对~C() 中的Sub dtor 的直接调用,第二次调用在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;
}
【问题讨论】:
标签: c++ constructor destructor placement-new