LeakChecker

プログラム実行中に何回メモリリークを起こしたかを教えてくれるユニット。
使用法は簡単。
プロジェクトに追加すれば OK です。
リークしていた場合、プログラム終了時に報告します。

使用上の注意: Unit によっては finalization でメモリの開放を行っているので、プロジェクトファイル(*1)の uses の先頭に LeakChecker を持ってきて、LeakChecker の finalization が最後に行われるようにしないと正しい結果が得られない場合があります。

(*1) ユニットファイルじゃないよ。

参考: Delphi のヘルプの GetMemoryManager, SetMemoryManager の例

unit LeakChecker;

interface

uses Windows, SysUtils;

implementation

var
  AllocCount: Integer;
  OldMemMgr: TMemoryManager;

function NewGetMem(Size: Integer): Pointer;
begin
  if Size <> 0 then Inc(AllocCount);
  Result := OldMemMgr.GetMem(Size);
end;

function NewFreeMem(P: Pointer): Integer;
begin
  if P <> nil then Dec(AllocCount);
  Result := OldMemMgr.FreeMem(P);
end;

function NewReallocMem(P: Pointer; Size: Integer): Pointer;
begin
  if P = nil then
  begin
    if Size <> 0 then Inc(AllocCount);
  end
  else if Size = 0 then Dec(AllocCount);

  Result := OldMemMgr.ReallocMem(P, Size);
end;

const
  NewMemMgr: TMemoryManager = (
  GetMem: NewGetMem;
  FreeMem: NewFreeMem;
  ReallocMem: NewReallocMem);

initialization
  GetMemoryManager(OldMemMgr);
  SetMemoryManager(NewMemMgr);
finalization
  if AllocCount > 0 then
    MessageBox(0, PChar('Leak count: ' + IntToStr(AllocCount)), 'Memory leak error', MB_OK or MB_ICONEXCLAMATION);
end.

Return index page