2012-02-22 6 views
1

2つの質問 1)オブジェクト/変数をスローしてキャッチするとどうなりますか?たとえば、オブジェクト/変数をスローするとどうなりますか?

int foo() { 
    FILE *fp = ....; 
    int dummy = 10; 
    int *dummy_ptr = new int[10]; 
    throw 1; 
} 

int main() { 
try { 
    foo(); 
} catch (int &i) { 
    std::cout<<"ERROR, the value is "<<i<<std::endl; 
} 
} 

ここではどうなりますか?新しい変数が作成されて渡されました???私は、(i int型) キャッチ(int型* I)//またはキャッチのように参照

なしポインタまたは変数を使用する場合

また、すべての変数/リソースが宣言された、または開始されないものを

スコープ内は解放された/閉じられましたか?

2)もし私が参照なしに再転居すれば、2番目のキャッチは新しい変数を得ることができるので、参照のために再スローする予定がある場合は キャッチ(& I int型)//プリント私の判断から、2 キャッチ(I int型)//プリント1

:中間スローは....

int goo() { 
    throw 2; 
} 

int foo() { 
    try{ 
     goo(); 
    } catch(int &i) { // (or) catch(int i) // i is not changing in the next line. 
     i = 2; 
     throw; 
    } 
} 

int main() { 
try { 
    foo(); 
} catch (int &i) { 
    std::cout<<"ERROR, the value is "<<i<<std::endl; 
} 
} 

OUTPUTに影響されません

私が考えているのは、参照である限り、値が中間ステップで '値渡し'の場合は、値に影響します。 元のオブジェクトを2番目のキャッチにスローします。

変数の制御フローは、このような状況では.....

答えて

0

はい、例外がスローの範囲やハンドラに到達するまで、すべての 囲むスコープで、すべての自動変数は が破壊されているスローされたとき。この上

ワンノート、 dummy_ptrであなたのメモリが*割り当て解除されることはありません、あなたのファイルポインタfpは*クローズされません。

+0

は理にかなっていますが、私はその正当な理由は考えていません...... ...何かがヒープ/スタックとそれ以降何かが間違っている、それを削除しないのは何ですか?スタックでは正常に動作しますが、ヒープでは動作しません。そしてここにすべてのものが作成された後、何か別の場所から渡されたものではありません......... – howtechstuffworks

+0

@howtechstuffworksヒープ上に物を作成するのは、その機能を残した後にそれらを永続させたいからです。 –

+0

^ええジェームズ、一般的なthats .......しかし、あなたの機能が失敗した場合は何点:......あなたはロールバックするすべてをしたくないですか? – howtechstuffworks

5

を中間キャッチを投げる本当にない(すなわち)、ここで何が起こりますか?新しい変数が作成されて渡されましたか?

はい。オブジェクトをスローすると、そのオブジェクトはどこかで作成され、例外が処理されると(つまり、再スローされずにブロックcatchを離れると)破棄されます。

参照なしでポインタまたは変数を使用するとどうなりますか?また、再スローの場合...

値をキャッチすると、そのオブジェクトのコピーが取得されます。例外を再現すると、次のハンドラは元の新しいコピーを取得し、あなたが行った変更は表示されません。参照によってキャッチすると、スローされたオブジェクトへの参照が与えられます。再スローすると、次のハンドラになります。オブジェクトをポインタで捕らえることはできません - ポインタがスローされた場合にのみポインタをキャッチします。

また、スコープ内で宣言または開始された変数はすべて閉じられていますか?ハンドラが到達するまで例外がthrowの範囲および全封入スコープで、すべての自動変数が破壊されるスローさ

。動的に割り当てられた変数(new int[10]など)はであり、ではなく、fcloseなどの任意のクリーンアップ関数は、スマートポインタなどのスコープベースのオブジェクトによって管理されていない限り、FILE*変数では確実に呼び出されません。

+0

ああ、ポインタの場合、それは私が指し示したもので、ポインタを投げて、それが扱うと思います。参照を処理するのと同じ方法で......今は意味がありません。 – howtechstuffworks

+0

@howtechstuffworks:ポインタを投げることは、普通は悪い考えです。ポインタが指しているものを慎重に考える必要があります。捕捉される前に破棄される可能性があるため、自動オブジェクトへのポインタを投げるべきではありません。キャッチャーがそれを忘れた場合に漏れることになるので、新しい動的オブジェクトへのポインタを投げてはいけません( 'catch(...)'で終わった場合にはできません)。通常、オブジェクトをスローするのが最善です。 –

+0

"例外がスローされると、すべての自動変数が破棄されます"正しいものの、それ以外のものは破棄されないので、 'new int [10] 'によって確保されたメモリが解放されるかどうかの質問が" 。 – hvd

0

私はそれを変数と呼ぶことはできません。それは名前を持っていません。しかし タイプintの新しいオブジェクトが作成され、実装によって と指定された不特定の場所に作成されます。参照によってキャッチすると、参照はその隠しオブジェクトにバインドされた です。 catch ブロックの終わりから落ちた場合、または 例外を再スローする以外の方法でcatchブロックを離れると、オブジェクトは“から解放され、”になります。

関連する問題