メモリリーク検出ツール
id:TakahiPoさんに教えてもらったメモリリーク検出ツールをcygwinで使ってみました。
その名もLeakTracer(http://www.andreasen.org/LeakTracer/)。
仕組みは非常に簡単で operator new/deleteなどをオーバーライドしてメモリ割り当て・解放の対応をチェックしているのである。
cygwinでの使い方は以下のとおり
- makeする
- 出来上がったLeakTracer.oをリークチェック対象にリンクする。(リークチェック対象は-gでビルドすること)
- リークチェック対象を実行すると leak.outファイルが生成される。
- 付属のleak-analyzeスクリプトでリーク場所を出力する。
例えばISO9660.exeをチェックすると以下のようにリークの場所がわかる。
#-- Leak: counted 1x / total Size: 80 0x40428c is in ISO9660::FindFileEntry(DirectoryEntry*, MonAPI::CString const&) (ISO9660.cpp:589). 588 { 589 DirectoryEntry* foundFile = new DirectoryEntry;
ちなみにISO9660.exeはもちろんリークしてました・・・orz
- delete -> delete[]の間違い
- 継承もとのデストラクタに virtual つけ忘れ。
自分が思ったよりもリークしていたのでMakefileにチェック用にLeakTracerを仕込んでおきました。