有没有一种方法可以通过编程判断FastMM是否没有释放特定的内存块



我正在尝试检测是否有内存块未释放。当然,经理告诉我这一点,但如果我想将结果存储在数据库中呢?例如,我想在数据库表中有一个分配给定块的例程的名称。

在阅读了FastMM的文档后,我知道自4.98版本以来,我们有可能在发生内存分配、释放和重新分配时收到管理器的通知。例如,OnDebugFreeMemFinish事件正在向我们传递包含有用信息的PFullDebugBlockHeaderPFullDebugBlockHeader缺少一件事——应用程序是否释放了给定块的信息。

除非只为未释放的块调用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);

这可能会被推翻,但也许有一个更简单的方法?

即使存在这样的处理程序,它也几乎毫无用处,因为当FastMM报告泄漏时,包括DB在内的所有东西都会关闭。

因此,我建议您在FastMM4Options.inc中打开LogErrorsToFileFullDebugMode条件句。这将为您提供一个带有泄漏的文本文件,稍后您可以解析该文件并将其放入DB中。

相关内容

  • 没有找到相关文章

最新更新