2012-01-28 7 views
6

にスローされたときにデストラクタは呼び出されませんが、次のコードを考えてみましょう例外が

Constructing object number 1 
Constructing object number 2 
Constructing object number 3 
Constructing object number 4 
Destructing object number 3 
Destructing object number 2 
Destructing object number 1 
Caught 4 

を私は、オブジェクトがスコープ外になったときにデストラクタが常に呼ばれていたと思いましたたとえ例外がスローされたとしても。この場合、Testインスタンスのデストラクタのいずれかが呼び出されないのはなぜですか?あなたは5Testオブジェクトの配列を作成しているが、あなたは3完全オブジェクトを作成した後、あなたが例外をスロー

+0

質問をStack Overflowに適したものに編集しました。将来の参照のために[質問のガイドライン](http://stackoverflow.com/questions/how-to-ask)に従ってください。そうしないと、質問が下書きされたり閉じたりする可能性があります。 –

答えて

8

、例外が4番目のオブジェクトのコンストラクタにしながら、スローされます。 4オブジェクトの構築は、コンストラクタの閉じ括弧に達するまで完了しません。

スタックは4番目と5番目のオブジェクトは、それらのデストラクタが呼び出されることはありません構築されなかったことから、それらが作成された逆の順序でそれらの3完全に構築されたオブジェクトのデストラクタを呼び出す巻き戻し。

例外のルールは次のとおりです。
例外がスローされると、そのスコープ内のすべての完全に作成されたオブジェクトのデストラクターが呼び出されます。
完全に作成されたオブジェクトは、コンストラクタが例外なく完全に呼び出されたオブジェクトです。代わりに、IDの後にはcout文を足すの

+0

この[Guru of the Weekの記事(#66)](http://www.gotw.ca/gotw/066.htm)は、この状況に特に関連しています。 –

+0

は1つだけです - 完全に構築されたオブジェクトは3つしかないので、デストラクタは3つしか呼び出されません。 –

+0

@ChrisDodd:ああよく見えます。私は痕跡を読んでいた。 –

3

=以下のように言及した数: -

id = count; 
    cout << "Constructing object number " << id << endl; 
    if(id == 4) 
    throw 4; 

あなたがthrowステートメントの後にそれを書かれているはずです。それは起こったことのあなたに良い の画像を与えていたでしょう。このようなもの: -

Test() { 
count++; 
id = count; 
if(id == 4) 
    throw 4; 
cout << "Constructing object number " << id << endl; 
    } 

O/Pがあったであろう: - オブジェクト番号2 消滅対象番号1を破壊対象番号3 を破壊オブジェクト番号3 構築オブジェクト番号2 構築オブジェクト番号1 構築します キャッチ4