1

2 つの質問 1) オブジェクト/変数が catch にスローされるとどうなりますか? たとえば、

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;
 }
}

この状況で、ここで何が起こりますか?新しい変数が作成されて渡されました???

参照なしでポインターまたは変数を使用するとどうなりますか

catch(int *i) // または catch (int i) のように

また、スコープ内で宣言または開始されたすべての変数/リソースは解放/クローズされていますか?

2) 再スローの場合も、参照を使用して再スローする場合、2 番目のキャッチは新しい変数を取得します。参照なしで (つまり) 値で再スローすると、中間スローで行われた変更は影響を受けません。 ....

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: catch(int &i) // 2 を出力します catch(int i) // 1 を出力します

私の判断では、

私が思うのは、それが参照である限り、中間ステップで「値渡し」すると値が影響を受けるということです。元のオブジェクトを 2 番目のキャッチにスローします。

(つまり) 変数の制御フローは実際には中間キャッチをスローしません.....

4

3 に答える 3

5

この状況で、ここで何が起こりますか?新しい変数が作成されて渡されましたか?

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

参照なしでポインタまたは変数を使用するとどうなりますか? 再投の場合も…

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

また、スコープ内で宣言または開始されたすべての変数は閉じられていますか?

例外がスローされると、すべての自動変数が破棄され、throwハンドラーに到達するまで、 およびすべての囲みスコープのスコープ内で破棄されます。動的に割り当てられた変数 ( your などnew int[10]) は削除され、スマート ポインターなどのスコープベースのオブジェクトによって管理されていない限り、変数に対して任意のクリーンアップ関数fcloseが呼び出されることはありません。FILE*

于 2012-02-22T17:13:51.963 に答える