メモリリーク

メモリリークの検出(Delphi5~2005)

Delphi5から2005までは、MemCheckでメモリリークを検出できた。

使い方は以下の通り。

  1. MemCheckをプロジェクトに組み込む。
  2. プロジェクトソースにMemChkの呼び出しを追加。
    
    begin
      MemChk; // チェック開始
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    
    
  3. プロジェクトオプションの「コンパイラ」で、「スタックフレームの生成」をチェック
  4. プロジェクトオプションの「リンカ」で、「TD32デバッグ情報を含める」をチェック

メモリーリークが起こるとファイルに詳細な情報が保存される。

メモリリークの検出(Delphi2006~)

Delphi2006以降はメモリマネージャが変わったため、MemCheckは使えなくなった。その代わり、標準でメモリリーク検出機能が用意されている。

使い方は以下の通り。


begin
  ReportMemoryLeaksOnShutdown := True;  //これ
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end;

ただ、この機能はメモリリークが起こったことを知らせるだけで、どこでメモリリークが起こったかはわからない。

詳細な情報がほしければ、FastMMを使うのがいい。新しいメモリマネージャはFastMMのサブセットで、どうせならフルセットを使ったほうがいい。

FastMMでメモリリークを検出する手順は以下の通り。

  1. FastMMに含まれるFastMM_FullDebugMode.dllを、プロジェクトのEXEファイルのある場所にコピー。またはDLLが検索されるフォルダ(例えば、C:\Windows\System32など)にコピー。
  2. プロジェクトソースを開く
  3. usesの先頭にFastMM4を追加。
  4. プロジェクトオプション - ディレクトリ/条件 - 条件定義に以下を追加。
    FullDebugMode;LogMemoryLeakDetailToFile;ClearLogFileOnStartup;EnableMemoryLeakReporting
  5. 「プロジェクト - オプション - コンパイラ - スタックフレームの生成」をチェック。
  6. 「プロジェクト - オプション - リンカ - TD32デバッグ情報を含める」をチェック。
  7. プロジェクトを再構築。
  8. メモリリークが見つかるとアプリケーション終了時にダイアログが出る。
  9. メモリリークの詳細は、EXEと同じフォルダに"EXEファイル名_MemoryManager_EventLog.txt"というファイルができているのでそれを見る。

見つけるのに苦労したメモリリークの原因

Tips

ブログ

リンク