2017-01-06 6 views
0

私は、ManagedFileという名前のfopenとfcloseのRAIIクラスを持っていて、何らかの理由でそれが失敗し、コンストラクタがスローしたとしましょう。RAIIコンストラクタがスローするとどうなりますか?

ManagedFile mf("e.txt") //fails and throws 
mf.F(//What would happen here?9 

mfは決して作成されませんか?

もし私が後でmfを使用するとどうなりますか?mfのファイル* Fにアクセスするとしますか?

RAIIクラスのコンストラクタが失敗した場合はどうなりますか?

+0

コンストラクタはどのように定義されていますか?いくつかのコードが必要です。 – DeiDei

+0

コンストラクタがスローすると 'mf'をどのように使うつもりですか? –

+0

また、基本コードの書式設定を習得しなくても、4年間でどのように5k担当者を得ましたか? :/ –

答えて

7

mfの構築に失敗した場合は、その後、mfの寿命はmfの任意の部分の構造は、(彼らの建設を完了した拠点とメンバーのデストラクタを呼び出すことによって)戻されます、始まったとみなされず、コントロールがcatchブロックに転送される(またはプログラムが終了する)ので、mfが使用される次の行には到達しません。

4

コンストラクタがスローする(スローされた例外がコンストラクタ自体にキャッチされない)場合、オブジェクトの構築は失敗します。

クラスにクラスメンバーがある場合、これらのクラスメンバーはコンストラクターが実行される前に完全に構​​築され、スローされた例外がスローされた例外が続行される前に破棄されます。

任意のスーパークラスのDitto。スローされた例外は、サブクラスの構築の開始前に構築されたスーパークラスを破棄し、その例外がスローされたコンストラクタに入る。

結論は、オブジェクトが細かく分解されていることです。つまり、オブジェクトがすでに構築されていても、オブジェクトは分解されます。

最後に、オブジェクトはおそらくどこにも存在できません。それが論理的に存在することはできません。

例外が検出されなかったため、例外が伝播され、オブジェクトが宣言されたスコープから終了する必要があります。

try 
{ 
     ManagedFile mf ( /* construct arguments */); 

     /* More code */ 
} catch (...) 
{ 
    /* More code */ 
} 

これは、あなたはおそらく、例外をキャッチすることができ、最も早い場所です:あなたは、例外をキャッチした場合でも

ManagedFileのコンストラクタでスローされた場合、実行はおそらくtryブロック内で継続できません。あなたは例外をキャッチしなければなりません、そして、これはあなたがそれを捕まえることができる最も早いものです。

このManagedFileオブジェクトはtryブロック内にのみ存在します。 tryブロックの外に存在しません。これにはcatchブロックが含まれます。そこにも存在しません。

したがって、このコンストラクタが例外をスローすると、オブジェクトが存在することは論理的に不可能になります。

P.S.オブジェクトがダイナミックスコープ(new)で構築されていた場合、スローされた例外は、例外がラダーに伝播する前に、newによって割り当てられたメモリの解放も処理します。

関連する問題