2009-05-15 14 views
1

C++では、次の例の違いは何ですか?ポインタによって捕捉された再スロー例外

再投ポインタ

catch (CException* ex) 
{ 
    throw ex; 
} 

シンプル再スロー:再スローがキャッチされた場合

catch (CException* ex) 
{ 
    throw; 
} 

、スタックトレースが違うのでしょうか?

+1

ライブラリで強制されない限り、ポインタで捕まえないほうが良いhttp://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.6 –

答えて

7

はい。基本的に、あなたは最初のケースでオブジェクトを投げています。 throw ex行で例外を生成したようです。 2番目のケースでは、元のオブジェクトをコールスタックに入れておくだけで(元のコールスタックを保持する)、それらは異なっています。通常、throw;を使用してください。

-2

パフォーマンスの違いがあると思います。 2番目のバージョンでは、例外の一時コピーは作成されません。最初はコピーを作成するので、seondは行く方法です。

単純な例外クラスを作成して試してみると、コンストラクタ/コピーコンストラクタを起動時にコンソールに出力させることができます。そうすれば、その違いを見るはずです。

+0

コピーは作成されませんポインタがスローされているため、最初のケースで構築されます。 –

+0

ポインタがコピーされたと私はそれを読んだ。なぜ彼はそれがパフォーマンスの違いをもたらしたと思うのだろうと思った。今私は彼が何を考えていたのか見ています。ええ、ポインタだけがコピーされ、コピーを削除することは間違っています。 –

関連する問題