void MyClass::method()
{
SomeObject a;
methodThatCanThrowException();
}
コールスタックではなく、コールスタックの上位で例外をキャッチしたいのですmethod()
が、この例ではSomeObject
デストラクタが呼び出されるのでしょうか?
void MyClass::method()
{
SomeObject a;
methodThatCanThrowException();
}
コールスタックではなく、コールスタックの上位で例外をキャッチしたいのですmethod()
が、この例ではSomeObject
デストラクタが呼び出されるのでしょうか?
はい。それがRAIIが機能する理由です。それが例外が機能する理由です。彼らはそうでなければしません。
完全な標準見積もり:
15.2 コンストラクタとデストラクタ [except.ctor]
1. throw 式からハンドラに制御が渡されると、try ブロックに入ってから構築されたすべての自動オブジェクトに対してデストラクタが呼び出されます。自動オブジェクトは、構築完了の逆の順序で破壊されます。
2.初期化または破棄が例外によって終了する保存期間のオブジェクトは、完全に構築されたすべてのサブオブジェクト (共用体のようなクラスのバリアント メンバーを除く)、つまり、プリンシパル コンストラクター ( 12.6.2) が実行を完了し、デストラクタがまだ実行を開始していない。同様に、オブジェクトの非委任コンストラクターが実行を完了し、そのオブジェクトの委任コンストラクターが例外で終了した場合、オブジェクトのデストラクターが呼び出されます。オブジェクトが new 式で割り当てられた場合、一致する割り当て解除関数 (3.7.4.2、5.3.4、12.5) があれば、それが呼び出されて、オブジェクトによって占有されているストレージが解放されます。
3.try ブロックから throw 式までのパス上に構築された自動オブジェクトのデストラクタを呼び出すプロセスは、「スタックの巻き戻し」と呼ばれます。スタックの巻き戻し中に呼び出されたデストラクタが例外で終了した場合、std::terminate が呼び出されます (15.5.1)。[注: したがって、デストラクタは通常、例外をキャッチし、デストラクタの外に伝播させないようにする必要があります。—終わりのメモ]
はい。スタックの巻き戻しと呼ばれることもあり
ます。スタックの上位で例外をキャッチすることは、多くの場合良い考えです。私は、多くのことができないときに例外をキャッチする多くのコードを見てきました。SomeObject
のデストラクタが例外をスローしないことを確認してください。