85

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

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

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

4

3 に答える 3

79

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

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

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

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

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

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

よく読んだ:

Herb Sutter によるコンストラクターの失敗

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

生物学的に言えば、受胎が起こり、コンストラクターが始まりましたが、最善の努力にもかかわらず、流産が続きました.コンストラクターは出産することはありませんでした.

ちなみに、これが、コンストラクターが成功しなかった場合にデストラクタが呼び出されない理由です。破棄するものは何もありません。「それは生きたことがないので、死ぬことはありません。」これにより、「コンストラクターが例外をスローしたオブジェクト」というフレーズが実際には矛盾していることに注意してください。そのようなものは、元のオブジェクトよりもさらに劣っています... それは生きたことも、あったことも、最初に呼吸したこともありません。

于 2012-04-18T15:35:15.087 に答える
23

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

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

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

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

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

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

おそらく、完成した建造物はすべて破壊されるでしょう。

はい

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

はい

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

はい

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

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

于 2012-04-18T16:48:27.073 に答える
6

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

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

于 2012-04-18T15:43:29.497 に答える