我试图检测一个内存块是否没有释放。当然,经理告诉我,通过对话框或日志文件,但如果我想将结果存储在数据库怎么办?例如,我想在数据库表中有一个分配给定块的例程名称。
阅读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);
这可以被覆盖,但也许有一个更容易的方法?