Я намагаюся виявити, чи не був звільнений блок пам'яті. Звичайно, менеджер мені каже, що за допомогою діалогового вікна або файлу журналу, але що робити, якщо я хотів би зберегти результати в базі даних? Наприклад, я хотів би мати в таблиці бази даних імена підпрограм, які виділяли задані блоки.
Після прочитання документації FastMM я знаю, що з версії 4.98 ми маємо можливість отримувати повідомлення від менеджера про розподіл пам’яті, звільнення та перерозподіл пам’яті в міру їх виникнення. Наприклад, OnDebugFreeMemFinish
подія передає нам PFullDebugBlockHeader
який містить корисну інформацію. Не PFullDebugBlockHeader
вистачає однієї речі - інформація, якщо даний блок було звільнено програмою.
Якщо OnDebugFreeMemFinish
тільки не викликається тільки не звільнені блоки? Це я не знаю і хотів би з’ясувати.
Проблема полягає в тому, що навіть підключившись до OnDebugFreeMemFinish
випадку, я не зміг з’ясувати, звільнився блок чи ні.
Ось приклад:
program MemLeakTest;
{$APPTYPE CONSOLE}
uses
FastMM4, ExceptionLog, SysUtils;
procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;
procedure Leak;
var
MyObject: TObject;
begin
MyObject := TObject.Create;
end;
begin
OnDebugFreeMemFinish := MemFreeEvent;
Leak;
end.
Чого мені не вистачає, це зворотній дзвінок:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Переглянувши джерело FastMM, я побачив, що є процедура:
procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
який можна було б відмінити, але, можливо, існує простіший спосіб?
OnDebugFreeMemFinish
викликається, це означає, що блок був звільнений. Немає OnMemoryLeak
події. Ніколи не могло бути такої події. Що робить FastMM, це при відключенні визначати, що будь-які блоки, які не були звільнені, повинні протікати. Він не може виявити витік раніше цього.
AppendEventLog
але вам потрібно змінити джерело FastMM, яке я підозрюю.