Я пытаюсь определить, не был ли освобожден блок памяти.Конечно, менеджер сообщает мне это по диалоговому окну или файлу журнала, но что, если я хотел бы сохранить результаты в базе данных?Например, я хотел бы иметь в таблице базы данных имена подпрограмм, которые распределяли данные блоки.
После прочтения документации 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);
, который можно переопределить, но, может быть, есть более простой способ?