web-dev-qa-db-ja.com

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

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

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

また、継承とメンバーはどうですか?おそらく、完成した建築物はすべて破壊されます。一部のメンバーのみが構築される場合、それらのメンバーのみが破壊されますか?多重継承がある場合、完了したコンストラクターはすべて破壊されますか?仮想継承は何かを変更しますか?

72
WilliamKF

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

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

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

完了したオブジェクトはすべて破棄されます。
コンストラクタが完全に呼び出されなかった場合、オブジェクトは決して構築されなかったため、破棄できません。

継承とメンバーはどうですか?おそらくすべての完成した建築物は破壊されます。一部のメンバーのみが構築される場合、それらのメンバーのみが破壊されますか?多重継承がある場合、完了したコンストラクターはすべて破壊されますか?仮想継承は何かを変更しますか?

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

グッドリード:

Herb SutterによるConstructor Failures

特に、彼が説明する部分が大好きです。

生物学的には、着想が行われました-コンストラクターが始まりました-しかし、最善の努力にもかかわらず流産が続きました-コンストラクターはterm(ination)に決して走りませんでした。

ちなみに、これが、コンストラクターが成功しなかった場合にデストラクタが呼び出されない理由です。破棄するものはありません。 "死ぬことはない、生きることはない。"これにより、句 "コンストラクタが例外をスローしたオブジェクト"本当に矛盾。そのようなものは、元のオブジェクトよりもさらに小さいです...それは、その最初に生きたことがなかった、決してなかった、決して呼吸しなかった。

70
Alok Save

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

コンストラクターを持つすべてのオブジェクトは、完了するまで実行されます。

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

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

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

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

おそらくすべての完成した建築物は破壊されます。

はい

一部のメンバーのみが構築される場合、それらのメンバーのみが破壊されますか?

はい

多重継承がある場合、完了したコンストラクターはすべて破壊されますか?

はい

仮想継承は何かを変更しますか?

番号。
ただし、仮想継承は、コンストラクターが呼び出される順序に影響します。順序の定義方法に慣れていない場合、正確なルールを調べるまで、これは直感的ではない場合があります。

19
Martin York

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

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

4
James Kanze