私のコードでは、HANDLE
からsを使用していますwindows.h
。彼らはのように使用されます
HANDLE h;
if (!openHandleToSomething(arg1, arg2, &h)) {
throw std::exception("openHandleToSomething error");
}
/* Use the handle in other functions which can throw as well */
if (!CloseHandle(h)) {
throw std::exception("closeHandle error");
}
CloseHandle
ご覧のとおり、取得と解放の途中で発生する可能性のあるすべての例外にこれを挿入する必要があります。したがって、1つを忘れて(または知らなかった派手なSEH例外があり)、ボイラーになる可能性があります。メモリリークが発生します。
CloseHandle
最近、私はそのような場合の頭痛を取り除き、これを自動的に呼び出すべきであるRAIIについて読みました。また、C ++のようstd::auto_ptr<someType>
に、で割り当てられたリソースの問題を解決するものがあることもわかりましたnew
。
しかし、私は使用せず、new
ただHANDLE
でtypedef
あるためvoid *
、をどのように使用すればよいのでしょうかstd::auto_ptr<someType>
。どういうわけか、それにカスタム削除関数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
)を与えることが可能であるはずです。クラスのインスタンスがスコープ外になるたびにデストラクタが呼び出されるため、クラスの作成は別のメソッドになります。ただし、単純なことすべてにクラスを設けるのはやり過ぎです。
これらの偶発的なメモリリークを修正するにはどうすればよいですか?
ライブラリがなく、依存関係が大きい純粋なC ++のソリューションを好むことに注意してください。ただし、それらが本当に小さく、ほとんどの環境で使用されている場合を除きます。