delphi – 有没有办法以编程方式告诉特定的内存块是否没有被Fast
发布时间:2020-12-15 05:26:53 所属栏目:大数据 来源:网络整理
导读:我试图检测一个内存块是否没有释放。当然,经理告诉我,通过对话框或日志文件,但如果我想将结果存储在数据库怎么办?例如,我想在数据库表中有一个分配给定块的例程名称。 阅读FastMM的文档后,我知道从4.98版本开始,我们有可能被管理器通知内存分配,释放
我试图检测一个内存块是否没有释放。当然,经理告诉我,通过对话框或日志文件,但如果我想将结果存储在数据库怎么办?例如,我想在数据库表中有一个分配给定块的例程名称。
阅读FastMM的文档后,我知道从4.98版本开始,我们有可能被管理器通知内存分配,释放和重分配,因为它们发生。例如OnDebugFreeMemFinish事件传递给我们一个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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |