次のコードでは、sub
クラス内のオブジェクトがC
2 回作成されます。最初の構成はデフォルトの ctor を呼び出し、 2 番目の構成は このオブジェクトを同じアドレスに再Sub()
構築するために使用します。placement new
したがって、デストラクタも 2 回呼び出されます。Sub
最初の呼び出しはdtorへの直接呼び出しを使用し~C()
、2 番目の呼び出しは の終了後に関数main()
によって呼び出されると思いatexit()
ます。
オブジェクトsub
が同じアドレスで再構築される場合、コンパイラは 2 番目のデストラクタを の後に呼び出す必要があることをどのように認識し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;
}