ユニットメモリマネージャー;
インタフェース
手順 SnapCurrMemStatToFile(ファイル名: string);
実装
用途
Windows、SysUtils、TypInfo;
定数
MaxCount = 高(ワード);
変数
OldMemMgr: TMemoryManager;
ObjList: ポインタの配列[0..MaxCount];
FreeInList: 整数 = 0;
GetMemCount: 整数 = 0;
FreeMemCount: 整数 = 0;
ReallocMemCount: 整数 = 0;
プロシージャ AddToList(P: ポインタ);
始める
FreeInList > High(ObjList) の場合
始める
MessageBox(0, '内存管理监視器指针列表溢れ出,请增大列表项数!', '内存管理监視器', mb_ok);
出口;
終わり;
ObjList[FreeInList] := P;
Inc(FreeInList);
終わり;
プロシージャ RemoveFromList(P: ポインタ);
変数
I: 整数。
始める
for I := 0 から FreeInList - 1 まで
ObjList[I] = P の場合
始める
Dec(FreeInList);
Move(ObjList[I + 1], ObjList[I], (FreeInList - I) * SizeOf(Pointer));
出口;
終わり;
終わり;
プロシージャ SnapCurrMemStatToFile(ファイル名: string);
定数
フィールド幅 = 20;
変数
出力ファイル: テキストファイル;
I、CurrFree、BlockSize: 整数。
ヒープステータス:THeapStatus;
アイテム: TObject;
ptd: PTypeData;
ppi: PPropInfo;
プロシージャ Output(テキスト: 文字列; 値: 整数);
始める
Writeln(OutFile, Text: FIELD_WIDTH, Value div 1024, ' KB(', Value, ' Byte)');
終わり;
始める
AssignFile(OutFile, ファイル名);
試す
FileExists(ファイル名)の場合
始める
追加(OutFile);
Writeln(OutFile);
終わり
それ以外
リライト(出力ファイル);
CurrFree := FreeInList;
ヒープステータス := GetHeapStatus; { 局部堆積状態 }
HeapStatus を使用して行う
始める
Writeln(OutFile, '===== ', ExtractFileName(ParamStr(0)), ',', DateTimeToStr(Now), ' =====');
Writeln(OutFile);
Output('可用地址空间 : ', TotalAddrSpace);
Output('未提交部分 : ', TotalUncommitted);
Output('已提交部分 : ', TotalCommitted);
Output('空闲部分 : ', TotalFree);
Output('すでに割り当て部分 : ', TotalAllocated);
Output('全部小空闲内存块 : ', FreeSmall);
Output('全部大空闲内存块 : ', FreeBig);
Output('其它未使用内存块 : ', 未使用);
Output('内部生存管理器消費 : ', オーバーヘッド);
Writeln(OutFile, '地址空间ダウンロード : ': FIELD_WIDTH, TotalAllocated div (TotalAddrSpace div 100), '%');
終わり;
Writeln(OutFile);
Writeln(OutFile, Format('当前出现 %d 处内存漏洞 :', [GetMemCount - FreeMemCount]));
for I := 0 から CurrFree - 1 まで
始める
Write(OutFile, I: 4, ') ', IntToHex(Cardinal(ObjList[I]), 16), ' - ');
ブロックサイズ := PDWORD(DWORD(ObjList[I]) - 4)^;
Write(OutFile, BlockSize: 4, '($' + IntToHex(BlockSize, 4) + ')字节', ' - ');
試す
アイテム := TObject(ObjList[I]);
if PTypeInfo(Item.ClassInfo).Kind <> tkClass then { タイプ情報テクニック }
write(OutFile, '不是对象')
それ以外
始める
ptd := GetTypeData(PTypeInfo(Item.ClassInfo));
ppi := GetPropInfo(PTypeInfo(Item.ClassInfo), '名前'); {結果が TComponent }
ppi <> nil の場合
始める
write(OutFile, GetStrProp(Item, ppi));
write(OutFile, ' : ');
終わり
それ以外
write(OutFile, '(未命): ');
Write(OutFile, Item.ClassName, ' (', ptd.ClassType.InstanceSize,
' 字节) - ', ptd.UnitName, '.pas');
終わり
を除外する
例外で行う
write(OutFile, '不是对象');
終わり;
writeln(OutFile);
終わり;
ついに
CloseFile(OutFile);
終わり;
終わり;
関数 NewGetMem(サイズ: 整数): ポインタ;
始める
Inc(GetMemCount);
結果 := OldMemMgr.GetMem(サイズ);
AddToList(結果);
終わり;
関数 NewFreeMem(P: ポインタ): 整数;
始める
Inc(FreeMemCount);
結果 := OldMemMgr.FreeMem(P);
リストから削除(P);
終わり;
関数 NewReallocMem(P: ポインタ; サイズ: 整数): ポインタ;
始める
Inc(ReallocMemCount);
結果 := OldMemMgr.ReallocMem(P, サイズ);
リストから削除(P);
AddToList(結果);
終わり;
定数
NewMemMgr: TMemoryManager = (
GetMem: 新しいGetMem;
FreeMem: 新しいFreeMem;
ReallocMem: NewReallocMem);
初期化
GetMemoryManager(OldMemMgr);
SetMemoryManager(NewMemMgr);
ファイナライズ
SetMemoryManager(OldMemMgr);
if (GetMemCount - FreeMemCount) <> 0 then
SnapCurrMemStatToFile(ExtractFileDir(ParamStr(0)) + '/Memory.Log');
終わり。