C++では、次の例の違いは何ですか?ポインタによって捕捉された再スロー例外
再投ポインタ:
catch (CException* ex)
{
throw ex;
}
シンプル再スロー:再スローがキャッチされた場合
catch (CException* ex)
{
throw;
}
、スタックトレースが違うのでしょうか?
C++では、次の例の違いは何ですか?ポインタによって捕捉された再スロー例外
再投ポインタ:
catch (CException* ex)
{
throw ex;
}
シンプル再スロー:再スローがキャッチされた場合
catch (CException* ex)
{
throw;
}
、スタックトレースが違うのでしょうか?
はい。基本的に、あなたは最初のケースでオブジェクトを投げています。 throw ex
行で例外を生成したようです。 2番目のケースでは、元のオブジェクトをコールスタックに入れておくだけで(元のコールスタックを保持する)、それらは異なっています。通常、throw;
を使用してください。
パフォーマンスの違いがあると思います。 2番目のバージョンでは、例外の一時コピーは作成されません。最初はコピーを作成するので、seondは行く方法です。
単純な例外クラスを作成して試してみると、コンストラクタ/コピーコンストラクタを起動時にコンソールに出力させることができます。そうすれば、その違いを見るはずです。
コピーは作成されませんポインタがスローされているため、最初のケースで構築されます。 –
ポインタがコピーされたと私はそれを読んだ。なぜ彼はそれがパフォーマンスの違いをもたらしたと思うのだろうと思った。今私は彼が何を考えていたのか見ています。ええ、ポインタだけがコピーされ、コピーを削除することは間違っています。 –
ライブラリで強制されない限り、ポインタで捕まえないほうが良いhttp://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.6 –