この質問は、デストラクタが呼び出された後にオブジェクトを使用することに触発されています
次のコードを考えてみましょう
class B
{
public:
B() { cout << "Constructor B() " << endl; }
~B() { cout << "Destructor ~B() " << endl; }
};
class A {
public:
B ob;
A()
try
{
throw 4;
}
catch(...)
{
cout << "Catch in A()\n";
}
A(int)
{
try
{
throw 4;
}
catch(...)
{
cout << "Catch in A(int)\n";
}
}
};
int main()
{
try
{
A f;
}
catch (...)
{
cout << "Catch in main()\n\n";
}
A g(1);
}
その出力は
Constructor B()
Destructor ~B()
Catch in A()
Catch in main()
Constructor B()
Catch in A(int)
Destructor ~B()
とは対照的にA(int)
、コンストラクターA()
には初期化リストの try/catch 構文があります。サブオブジェクトの破壊の順序に違いがあるのはなぜですか? でスローされた例外が にA()
伝播するのはなぜmain()
ですか?