<9666> [D5] Re:メモリについて


>Delphiで下手なプログラムを書いているせいか、メモリが一方的に増えている
>プログラムをかいてしまいました。ある環境では正常だったりして、困っています。
>プログラムでメモリ関係を監視したり、制御できるプログラムを書きたいのですが
>思い浮かびません。お助けください。
メモリの開放し忘れが問題であるなら以下のユニットmemchkで検出できます
使い方は[プロジェクト-ソース表示]でプロジェクトソースを表示し、
uses memchkするだけです。プログラム終了時に開放し忘れたメモリの個数を指摘します。
ただしどこでメモリリークが発生しているかは分からないので、開発初期段階からこまめにチェ
ックするとデバッグしやすいです。

プロジェクトソース
program Project1;
uses
	memchk in 'memchk.pas', // 一番最初にusesする
	Forms,
	Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
	Application.Initialize;
	Application.CreateForm(TForm1, Form1);
	Application.Run;
end.

メモリリーク検出ユニット
unit memchk;
// {$define Release} // リリース時に定義
interface
implementation
{$ifndef Release}
uses SysUtils, Windows;

var HeapCount: Integer;
var MemMgr, orgMemMgr: TMemoryManager;

function MyGetMem(Size: Integer): Pointer;
begin
	Inc(HeapCount);
	Result := orgMemMgr.GetMem(Size);
end;

function MyFreeMem(P: Pointer): Integer;
begin
	Result := orgMemMgr.FreeMem(P);
	Dec(HeapCount);
end;

function MyReallocMem(P: Pointer; Size: Integer): Pointer;
begin
	Result := orgMemMgr.ReallocMem( P, Size );
end;

procedure Initialize;
begin
	GetMemoryManager( orgMemMgr );
	MemMgr.GetMem			:= @MyGetMem;
	MemMgr.FreeMem		:= @MyFreeMem;
	MemMgr.ReallocMem	:= @MyReallocMem;
	SetMemoryManager( MemMgr );
end;

procedure Finalize;
begin
	SetMemoryManager( orgMemMgr );
	if HeapCount <> 0 then
		MessageBox( 0,
			PChar(Format( '%d個のメモリリーク', [HeapCount] )),
			PChar(ParamStr(0)),
			MB_OK or MB_ICONSTOP );
end;

initialization
  Initialize;
finalization
 Finalize;
{$endif}
end.

投稿者: tomo
リモートホスト: 133.205.142.205
メールアドレス: ntomo@mte.biglobe.ne.jp
投稿日: 2000年02月26日 14時44分33秒
キーワード: メモリ,マネージャー