2013-10-29 6 views
18

は、次のコードを考えてみます。要素のデフォルトのコンストラクタがスローできる場合、new []?

example_t* a = new example_t[8]; 

クラスexample_tを投げることができるデフォルトのctorのを持って、配列内の5番目の要素のものと想定建設がスローされます。最初の4つの要素のデストラクタへの自動呼び出しがありますか?それは明確な行動ですか? §5.3.4/8当たり

答えて

14

これは完全に明確に定義され、よく振る舞っています。すべての完全に構築されたサブオブジェクトは、オブジェクトの初期化がその構築の逆の順序で例外で終了すると、破壊されます。これは、ユーザー定義型のオブジェクト(クラスとクラスメンバーを考える)の場合と同じです。

形式的に、我々は、C++ 11 15.2/2を有する:

初期化または破壊例外で終了し デストラクタが完全に構築サブオブジェクトの全てに対して実行されたであろう任意の保存期間のオブジェクト( ユニオン様クラスのバリアントメンバーを除く)、つまり主コンストラクタ(12.6.2)が実行を完了したサブオブジェクトの場合 であり、デストラクタはまだ実行を開始していません。

+0

+1ありがとうございました!破壊の命令*は不定で実装に移されましたか?(このサンプル内の命令(http://ideone.com/BHZWo4)は私には面白いです) – WhozCraig

+0

@WhozCraig:いいえ、注文を指定する必要があります(古いものを参照している新しいものについて考えてください)私は正式な声明を見つけることができるかどうかを見てみましょう –

+0

ありがとうございます。 – WhozCraig

9

新しい式が 割り当て機能(3.7.4.1)を呼び出してオブジェクトのストレージを取得します。 new-expressionが で終了した場合、 割り当て解除機能(3.7.4.2)を呼び出してストレージを解放することがあります。割り当てられた型が非配列 型である場合、割り当て関数の名前は演算子newであり、 割り当て解除関数の名前は演算子deleteです。割り振りタイプ が配列タイプの場合、割り振り関数の名前は演算子new []で、 割り振り解除関数の名前は演算子delete []です。

解除機能がデストラクタを呼び出すため、削除されます。

 


私が知っているに寄りかかっコンパイラの出力に含ま信頼-ことはできませんが、それは少なくとも良い観察です:Live Test

+3

質問はストレージに関するものではなく、要素のデストラクタに関するものでした。 – sharptooth

+11

私はしばしば、特に、* that *のような文で、 "may"のより深い意味に着手するために休止を与えます。 – WhozCraig

+1

割り当て解除関数(例えば、 'delete')がデストラクタを呼び出しませんか? – deepmax

関連する問題