103

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

在阅读了 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);

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

4

1 回答 1

2

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

所以,我建议你LogErrorsToFileFullDebugMode. FastMM4Options.inc这将为您提供一个带有泄漏的文本文件,稍后您可以对其进行解析并放入 DB。

于 2013-10-23T11:10:20.637 回答