メモリリーク検出ツール

id:TakahiPoさんに教えてもらったメモリリーク検出ツールをcygwinで使ってみました。
その名もLeakTracer(http://www.andreasen.org/LeakTracer/)。


仕組みは非常に簡単で operator new/deleteなどをオーバーライドしてメモリ割り当て・解放の対応をチェックしているのである。
cygwinでの使い方は以下のとおり

  1. makeする
  2. 出来上がったLeakTracer.oをリークチェック対象にリンクする。(リークチェック対象は-gでビルドすること)
  3. リークチェック対象を実行すると leak.outファイルが生成される。
  4. 付属の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を仕込んでおきました。