プログラム実行中に何回メモリリークを起こしたかを教えてくれるユニット。
使用法は簡単。
プロジェクトに追加すれば 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.