operator delete
operator deleteを何とか上手く活用しようと試行錯誤した時のログです。
struct Foo{ int* a_; Foo(){ a_ = new int; // 例外を投げるかもしれない処理 throw 1; } // デストラクタでは何もしない ~Foo(){} void Release(){ delete a_; } // 定義していないと例外時にoperator deleteが呼ばれない void* operator new(std::size_t size){ return ::operator new(size); } void operator delete(void* p){ if (p){ Foo* f = static_cast<Foo*>(p); f->Release(); ::operator delete(p); } } };
という使い方を考えてみました。 コンストラクタで例外が発生してもリークしません。
でも、operator delete使うよりも
struct Foo{ int* a_; Foo(){ a_ = new int; // 例外を投げるかもしれない処理 try{ throw 1; } catch(...){ Release(); throw; } } ~Foo(){ Release(); } void Release(){ delete a_; } };
try/catch使う方が自然な気がするので良い使い方とは言えませんでした。
ちなみに今回の場合だとスマートポインタを使うのが一番スマートです。