2012-01-09 88 views
102

我想检测一块内存是否没有被释放。当然,经理告诉我,通过对话框或日志文件,但是如果我想将结果存储在数据库中呢?例如,我希望在数据库表中包含分配给定块的例程名称。有没有办法通过编程来判断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 LogMemoryLeakOrAllocatedBlock(APointer: PFullDebugBlockHeader; IsALeak: Boolean); 

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader); 

浏览FastMM的,我看到有一个过程的源后

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

+0

使用适当的设置完整的FastMM,您将收到关闭时所有泄漏块的详细报告。这不足以满足您的需求吗? – 2012-01-09 07:31:44

+0

不,正如我写的:“关闭应用程序时泄漏是按预期报告的”,这不是我想要的。我想自己记录它。 – Wodzu 2012-01-09 07:59:23

+7

我一直都明白FastMM只能做这个检查,就像程序应该做的VAST LAST动作 - 按照定义 - 所以到FastMM完成报告时代码已经完成。要获得部分解决方案,您可以始终查看其源代码,以查看分配的内存如何标记。 – 2012-01-09 08:06:52

回答

1

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

因此,我建议您在FastMM4Options.inc中打开LogErrorsToFile以及FullDebugMode条件。这会给你一个泄漏的文本文件,以后你可以解析并放入数据库。

相关问题