クラスメソッドでstd::bad_alloc
例外を取り扱うときは、メモリは可能な限り/意味のないことが試みられます例外を再発行する前にオブジェクトを解放することができ、いくつかのstdコンテナ(STD ::ベクトル<>)を持っているのであれば、我々のような何かを行う可能性があります:
catch(std::bad_alloc& e) {
//free any memory in my std::vector member, how? by doing this dirty hack
~myVec();
new (&myVec) std::vector<myType>();
throw; //rethrow exception
}
質問:は、上記の「汚いハック」への安全な戦略であります例外が展開されている間に途中でメモリを解放しますか?長所と短所は何ですか?
例外がスローされると、スタックは巻き戻され、その上にある任意のオブジェクトにはデストラクタが呼び出されます。私はあなたの質問を理解していません。なぜなら、RAIIはそのようなケースを扱うことになっているからです。 –
@EtiennedeMartel、確かに、スタック内のオブジェクトをカバーします。ここでは、例外を処理するオブジェクトのメンバーについて説明します。エラーの意味は明らかに、このようなエラーがメンバーデータがもう必要でないことを意味する必要があります。 – lurscher
@lurscher:なぜですか?クラスをクリーンアップする必要がある場合、クラスはスタック上にあるか、スマートポインタによって所有されます。そうでなければ、それはきれいにする必要はありません。クラスメソッドで例外をスローしても、メンバ変数をクリアする必要はありません。 – Puppy