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