Есть ли способ программно сказать если конкретный блок памяти не был освобожден FastMM?

Я пытаюсь определить, не был ли освобожден блок памяти. Конечно, менеджер сообщает мне это с помощью диалогового окна или файла журнала, но что, если я хочу сохранить результаты в базе данных? Например, я хотел бы иметь в таблице базы данных имена подпрограмм, которые выделяли данные блоки.

После прочтения документации 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);

, которую можно переопределить, но, возможно, есть способ попроще?

103
задан dataol 14 January 2013 в 19:37
поделиться