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