delphi – 有没有办法以编程方式告诉特定的内存块是否没有被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);

这可以被覆盖,但也许有一个更容易的方法

解决方法

即使这样的处理程序存在,它几乎没有用,因为一切,包括DB将在FastMM报告泄漏时关闭

所以,我建议你打开LogErrorsToFile连同FullDebugMode条件在FastMM4Options.inc。这将给你一个文本文件泄漏,以后你可以解析和放入DB。

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...