有没有办法以编程方式判断FastMM是否没有释放特定的内存块?

Wod*_*dzu 103 delphi memory-leaks delphi-2009 fastmm

我试图检测是否释放了一块内存.当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称.

在阅读了FastMM的文档之后,我知道从版本4.98开始,我们有可能被管理员通知内存分配,释放和重新分配.例如,OnDebugFreeMemFinish事件传递给我们a 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.
Run Code Online (Sandbox Code Playgroud)

我缺少的是回调,如:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Run Code Online (Sandbox Code Playgroud)

在浏览FastMM的源代码后,我发现有一个过程:

procedure LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean);
Run Code Online (Sandbox Code Playgroud)

可以覆盖,但也许有一个更简单的方法?

Ser*_*lyk 2

即使存在这样的处理程序,它也几乎毫无用处,因为当 FastMM 报告泄漏时,包括数据库在内的所有内容都将被关闭。

LogErrorsToFile因此,我建议您与FullDebugMode中的条件一起打开FastMM4Options.inc。这将为您提供一个带有泄漏的文本文件,稍后您可以解析该文件并将其放入数据库中。