unit Manajer Memori;
antarmuka
Prosedur SnapCurrMemStatToFile(Nama file: string);
pelaksanaan
kegunaan
Windows, SysUtils, TypInfo;
konstanta
MaxCount = Tinggi(Kata);
var
OldMemMgr: TMemoryManager;
ObjList: array[0..MaxCount] dari Pointer;
Daftar Gratis: Integer = 0;
GetMemCount: Bilangan Bulat = 0;
FreeMemCount: Bilangan Bulat = 0;
ReallocMemCount: Bilangan Bulat = 0;
prosedur AddToList(P:Penunjuk);
mulai
jika FreeInList > Tinggi(ObjList) maka
mulai
MessageBox(0, '内存管理监视器指针列表溢出,请增大列表项数!', '内存管理监视器', mb_ok);
KELUAR;
akhir;
Daftar Obj[Daftar Gratis] := P;
Inc(Daftar Gratis);
akhir;
prosedur HapusDariDaftar(P:Penunjuk);
var
Saya: Bilangan Bulat;
mulai
untuk I := 0 hingga FreeInList - 1 lakukan
jika ObjList[I] = P maka
mulai
Des(Daftar Gratis);
Pindahkan(DaftarObj[I + 1],DaftarObj[I], (DaftarInBebas - I) * SizeOf(Penunjuk));
KELUAR;
akhir;
akhir;
prosedur SnapCurrMemStatToFile(Nama file: string);
konstanta
FIELD_WIDTH = 20;
var
File Keluar: File Teks;
Saya, CurrFree, BlockSize: Integer;
HeapStatus: THeapStatus;
Barang: Objek;
ptd: PTypeData;
ppi: PPropInfo;
prosedur Output (Teks: string; Nilai: integer);
mulai
Writeln(OutFile, Teks: FIELD_WIDTH, Nilai div 1024, ' KB(', Nilai, ' Byte)');
akhir;
mulai
AssignFile(OutFile, Nama File);
mencoba
jika FileExists(Nama file) lalu
mulai
Tambahkan(OutFile);
Writeln(File Keluar);
akhir
kalau tidak
Menulis Ulang(OutFile);
CurrFree := Daftar Gratis;
HeapStatus := DapatkanHeapStatus; { 局部堆状态 }
dengan HeapStatus lakukan
mulai
Writeln(OutFile, '===== ', ExtractFileName(ParamStr(0)), ',', DateTimeToStr(Sekarang), ' =====');
Writeln(File Keluar);
Output('可用地址空间 : ', TotalAddrSpace);
Output('未提交部分 : ', TotalTidak Berkomitmen);
Output('已提交部分 : ', Total Berkomitmen);
Output('空闲部分 : ', TotalGratis);
Output('已分配部分 : ', TotalAlokasi);
Output('全部小空闲内存块 : ', FreeSmall);
Output('全部大空闲内存块 : ', FreeBig);
Output('其它未用内存块 : ', Belum Digunakan);
Output('内存管理器消耗 : ', Overhead);
Writeln(OutFile, '地址空间载入 : ': FIELD_WIDTH, div TotalAllocationd (TotalAddrSpace div 100), '%');
akhir;
Writeln(File Keluar);
Writeln(OutFile, Format('当前出现 %d 处内存漏洞 :', [GetMemCount - FreeMemCount]));
untuk I := 0 hingga CurrFree - 1 lakukan
mulai
Write(OutFile, I: 4, ') ', IntToHex(Kardinal(ObjList[I]), 16), ' - ');
Ukuran Blok := PDWORD(DWORD(ObjList[I]) - 4)^;
Write(OutFile, BlockSize: 4, '($' + IntToHex(BlockSize, 4) + ')字节', ' - ');
mencoba
Barang := TObject(ObjList[I]);
jika PTypeInfo(Item.ClassInfo).Jenis <> tkClass lalu { ketik info teknik }
write(OutFile, '不是对象')
kalau tidak
mulai
ptd := GetTypeData(PTypeInfo(Item.ClassInfo));
ppi := GetPropInfo(PTypeInfo(Item.ClassInfo), 'Nama'); { 如果是TKomponen }
jika ppi <> nihil maka
mulai
write(OutFile, GetStrProp(Item, ppi));
tulis(File Keluar, ' : ');
akhir
kalau tidak
write(OutFile, '(未命名): ');
Tulis(OutFile, Item.ClassName, ' (', ptd.ClassType.InstanceSize,
' 字节) - Dalam ', ptd.UnitName, '.pas');
akhir
kecuali
pada Pengecualian lakukan
write(OutFile, '不是对象');
akhir;
writeln(File Keluar);
akhir;
Akhirnya
TutupFile(File Keluar);
akhir;
akhir;
fungsi NewGetMem(Ukuran: Integer): Pointer;
mulai
Inc(GetMemCount);
Hasil := OldMemMgr.GetMem(Ukuran);
AddToList(Hasil);
akhir;
fungsi NewFreeMem(P: Pointer): Integer;
mulai
Inc(GratisMemCount);
Hasil := OldMemMgr.FreeMem(P);
HapusDariDaftar(P);
akhir;
fungsi NewReallocMem(P: Pointer; Ukuran: Integer): Pointer;
mulai
Inc(ReallocMemCount);
Hasil := OldMemMgr.ReallocMem(P, Ukuran);
HapusDariDaftar(P);
AddToList(Hasil);
akhir;
konstanta
MemMgr Baru: TMemoryManager = (
GetMem: GetMem Baru;
FreeMem: FreeMem Baru;
ReallocMem: ReallocMem Baru);
inisialisasi
GetMemoryManager(OldMemMgr);
SetMemoryManager(NewMemMgr);
finalisasi
SetMemoryManager(OldMemMgr);
jika (GetMemCount - FreeMemCount) <> 0 lalu
SnapCurrMemStatToFile(ExtractFileDir(ParamStr(0)) + '/Memory.Log');
akhir.