我正在尝试检测是否未释放内存块。当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称。
在阅读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);
可以覆盖,但也许有更简单的方法?
答案 0 :(得分:1)
即使存在这样的处理程序,它也几乎无用,因为在FastMM报告泄漏时,包括DB在内的所有内容都将被关闭。
因此,我建议您在LogErrorsToFile
中启用FullDebugMode
和FastMM4Options.inc
条件。这将为您提供一个带有泄漏的文本文件,稍后您可以解析并放入DB。