次のコードを検討してください。
example_t* a = new example_t[8];
クラスexample_t
には、スローできるデフォルトのctorがあります。配列スローの5番目の要素の構築を想定してください。最初の 4 つの要素のデストラクタへの自動呼び出しはありますか? それは明確に定義された動作ですか?
次のコードを検討してください。
example_t* a = new example_t[8];
クラスexample_t
には、スローできるデフォルトのctorがあります。配列スローの5番目の要素の構築を想定してください。最初の 4 つの要素のデストラクタへの自動呼び出しはありますか? それは明確に定義された動作ですか?
これは完全に明確に定義され、適切に動作します。オブジェクトの初期化が例外で終了した場合、完全に構築されたすべてのサブオブジェクトは、構築とは逆の順序で破棄されます。これは、ユーザー定義型のオブジェクト (クラスとクラス メンバーを考えてください) の場合と同様に、配列の場合も同じです。
正式には、C++11 15.2/2 があります。
初期化または破棄が例外によって終了する保存期間のオブジェクトは、完全に構築されたすべてのサブオブジェクト (共用体のようなクラスのバリアント メンバーを除く)、つまり、プリンシパル コンストラクター ( 12.6.2) が実行を完了し、デストラクタがまだ実行を開始していない。