2016-08-13 8 views
0

によって例外オブジェクトを投げるのは良いですまあ、私は例外処理の間違いを避けることについて語っthis記事を読んでてきた、それは罰金だが、私は明確化のために立ち往生一点は、それがは、それが参照

を言われていると、あります

例外がスローされ、コントロールがtryブロックから ハンドラに渡されると、C++ランタイムは、tryブロックの開始以降に構築されたすべての自動オブジェクト のデストラクタを呼び出します。

そして、それは一見のキャッチを参照することにより、オブジェクトを投げ示唆している別のポイント、それはメモリ管理やコピーを避けるため、お勧めしているものと比較するとき、どのような私には奇妙に思えることは

try 
{ 

Object o; 
//make error.. 
throw ref(o); 
}catch(Object & p) 
{ 
//do some handle.. 
} 

です上のようなコードを使って行ってもいいと思うが、try内に構築されたすべてのオブジェクトがスローに到達したときに解体されるわけではない。

+1

投げ値を(寿命の問題を回避するために)値でオブジェクトを投げるとキャッチすべきです。参照をキャッチします。 –

+1

何ですか?参照:「間違い#6:価値によって例外を投げない」 –

答えて

2

参照によって例外オブジェクトをスローするとよいですか?

いいえ。あなたの例では、oは投げた後のスタック巻き戻しの一部として破壊されるので、ぶら下がっている参照を捕まえることになります。

言う記事行い、その値によってスロー:throw o;throw std::move(o);oが安い・ツー・移動・ハード・ツー・コピーである場合)、または別の関数で例外チューニングを移動し、throw make_error(/*...*/)ような何かを行います。これにより、別々の生涯を持ち、処理されるまでのスタックを解除しても破壊されないオブジェクトoのコピーがスローされます。

例外オブジェクトと潜在的なスライシングの余分なコピーを避けるには、参照(catch Object& o)で例外をキャッチする必要があります。

だから、(スライシングと余分なコピーを避けるため)、参照によって

関連する問題