2011-03-07 7 views
1

をスローすると、次のような落とし穴があります。boost :: shared_ptr <customException>

if (someCondition) 
    throw boost::shared_ptr<SomeException>(new SomeException("foo!")); 

... 

catch(const boost::shared_ptr<SomeException>& expRef) 
{ 
} 
+0

これは珍しいという事実を除けば、なぜあなたは 'shared_ptr'を投げたいのですか? –

+1

あなたがコードを複雑にしていることに加えて、より簡単に書くことができ、パフォーマンスが向上するかもしれないもののパフォーマンスの低い構成(動的割り当て)を使用する...私は他の落とし穴を考えることはできません。 –

+0

shared_ptrをスローすると、スライシングなしで、または例外クラスでクローンを実装しなくても、非同期境界を越えて例外を伝播できます。 –

答えて

4

はい、落とし穴があります。あなたは、基底クラスに基づいてキャッチすることができません。

void f() 
{ 
    throw std::runtime_error("look here"); 
} 
void g() 
{ 
    throw boost::shared_ptr<std::runtime_error>("look here"); 
} 

int main() 
{ 
    try 
    { 
    f(); 
    } 
    catch (std::exception const& e) {} 

    try { g(); } 
    catch (boost::shared_ptr<std::exception> const& e) {} // no work 
} 

あなたは、もちろん、それはベースの上に投げる作ることができますが、その後、あなたが派生キャッチすることはできません。

だから...しないでください。

6

あなたはポインタによってスローされないよう、そしてthrowing by valuecatching by (const) referenceを好む必要があります。

スマートポインタを使用すると、ポインタを使用する際のリソース管理が簡素化されますが、ポインタの使用を避けることができれば簡単になります。ちょうど値を投げる。

+0

+1、これはCrazy Eddieと同じくらい良い答えです。私が彼を選んだ理由は、1)私があなたが2)あなたが言及したという事実を認識していた間、前に言ったことについて私は考えなかった。 – lurscher

1

私が見ることができる唯一の落とし穴は、あなたがしなければならないときに、あなたが何か苦労しているということです。 :-)

通常、オブジェクトの存続時間を管理するためにshared_pointerを使用します。それ以外の場合は明白ではありません。ここでは、投げられた例外を管理するのはの責任ではないことは明らかです。コンパイラはあなたのためにそれを行う必要があります!

例外が処理されると、実行時にshared_pointerが破棄され、例外オブジェクトが破棄されます。そうしないと、ランタイムは例外オブジェクトを直接破壊してしまいます。あなたは何を得ますか?

関連する問題