103

メモリのブロックが解放されていないかどうかを検出しようとしています。もちろん、マネージャはダイアログ ボックスまたはログ ファイルでそれを教えてくれますが、結果をデータベースに保存したい場合はどうすればよいでしょうか。たとえば、データベーステーブルに、特定のブロックを割り当てたルーチンの名前を付けたいと思います。

FastMM のドキュメントを読んだ後、バージョン 4.98 以降、メモリの割り当て、解放、および再割り当てが発生すると、マネージャーから通知される可能性があることがわかりました。たとえば、有用な情報を含むOnDebugFreeMemFinishイベントが私たちに渡されます。PFullDebugBlockHeader欠けているものが 1 つあり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);

これはオーバーライドできますが、もっと簡単な方法がありますか?

4

1 に答える 1