2012-04-18 8 views
60

C++では、コンストラクタが例外をスローすると、どのデストラクタが実行されますか?コンストラクタが例外をスローすると、どのデストラクタが実行されますか?

特に、例外が初期化リストまたは本文の間にある場合は、それは何か違いがありますか?

また、継承とメンバーについてはどうですか?おそらくすべての完成した構造物が破壊されるでしょう。いくつかのメンバーだけが構築された場合、それらは破壊されますか?複数の継承がある場合、完了したコンストラクタはすべて破棄されますか?仮想継承は何かを変えますか?

+2

これは自分でテストしなかった理由はありますか? –

+23

@Steve:移植性のある保守可能なコードが必要な場合は、特定のコンパイラバージョンの動作に依存することはひどい考えです。 –

+0

@BenVoigt - 私は理論的に同意します。しかし、あなたが現実世界でコーディングしているときには、現実に対処する必要があります。そして、すべての主要なコンパイラがこの権利を得られなかったら、私は非常に驚くでしょう。 –

答えて

57

コンストラクタが例外をスローすると、どのデストラクタが実行されますか?

そのスコープで完全に作成されたすべてのオブジェクトのデストラクタです。

例外が初期化リストまたは本文中にある場合は、何か違いがありますか?

完成したオブジェクトはすべて破壊されます。
コンストラクタが決して完全に呼び出されなかった場合、オブジェクトは構築されなかったため、破壊されることはありません。

どのような継承とメンバーですか?おそらくすべての完成した構造物が破壊されるでしょう。いくつかのメンバーだけが構築された場合、それらは破壊されますか?複数の継承がある場合、完了したコンストラクタはすべて破棄されますか?仮想継承は何かを変えますか?

完成したすべての構造が破壊されます。はい、完全に作成されたオブジェクトだけが破壊されます。

グッド読む:特に

Constructor Failures by Herb Sutter

が、彼は説明して一部を愛する: - コンストラクタが始まった - 生物学用語で

、概念が開催されましたが、にも関わらず最善の努力の後には流産が続いた - コンストラクターは決して語り継がれなかった(ination)。

ちなみに、これは、コンストラクタが成功しなかった場合、デストラクタは決して呼び出されません。破壊するものは何もありません。 「死ぬことはできません。それは決して生きなかったからです。これにより、フレーズが "コンストラクタが例外をスローしたオブジェクト"が実際に暴力団になります。そのようなものは、元来の物よりもずっと小さい...それは決して生きていない、決してなかった、決して最初に呼吸したことはない。

+0

「論理スコープ」は、どのような意味でですか? –

+1

@ Alsの[以前の回答](http://stackoverflow.com/a/9972063/179910)とおおよそ同じテーマを読んでみてください。 –

4

コンストラクタのために残ったローカルスコープで作成されたオブジェクトは、すべて に破壊されます。実行時処理では、ハンドラが見つかるまで、 デストラクタを呼び出して、スタックをバックアップします。

例外がコンストラクタからスローされた場合、完全に構築されたすべてのサブオブジェクトのデストラクタが呼び出されます。さらに、 コンストラクターがnew式の一部である場合、適切な配置 削除演算子が存在する場合は、それが呼び出されます。

+0

+1 new'd式で何が起こるかの説明。これは重要。 –

14

コンストラクタが例外をスローすると、どのデストラクタが実行されますか?

コンストラクタが完了するまで実行されたすべてのオブジェクト。

特に、初期化リストまたは本文中に例外がある場合は、違いがありますか?

いいえ。例外の前に完全に構​​築されたすべてのメンバーは、デストラクタを実行します。建設中に投げられたメンバーと他のすべての非建設メンバーは、でなく、はデストラクタを実行します。メンバ構築の順番はよく定義されているので、例外スローのポイントを知っていれば何が起きるか正確に知ることができます。

また、継承とメンバーはどうですか?

同じルールが適用されます。

おそらくすべての完成した構造が破壊されます。

はい

一部のメンバーだけが構築されている場合は、唯一のものは破壊できますか?

はい

多重継承がある場合は、すべての完成コンストラクタは破壊できますか?

はい

仮想継承は何も変更していますか?


しかしメモ:仮想継承は、コンストラクタが呼び出される順序には影響しません。順序がどのように定義されているかに精通していない場合は、正確な規則を検索するまで直感的ではありません。

関連する問題