下面的示例应用程序显示了问题所在:
program FalseMemLeak;
uses
ShareMem;
var
o: TObject;
begin
o := TObject.Create; // "good" leak
RegisterExpectedMemoryLeak(o);
TInterfacedObject.Create; // bad leak
end.我现在正在使用BorlndMM.dll替换,FastMMFullDebug.dll和我得到以下报告:
---------------------------
FalseMemLeak.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are:
5 - 12 bytes: TObject x 1
13 - 20 bytes: TInterfacedObject x 1
---------------------------
OK
---------------------------当我删除“坏”内存泄漏时,一切都很好,没有显示任何报告。但是,一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。
最初,我发现这是当我寻找这些独立内存泄漏,并发现他们注册,但仍然报告了那些真正的内存泄漏。
当我使用内置ReportMemoryLeaksOnShutdown := True时,它只报告TInterfacedObject的泄漏。
那么,在完全调试模式下使用FastMM时,是否有一种过滤已注册内存泄漏的方法?
为了说明这一点:这是随FastMM压缩而来的FastMM,它声明这是开箱即用的FastMM_FullDebugMode.dll的替代品,它使用FastMM4并加载FastMM_FullDebugMode.dll。因此,对内存管理器的所有调用都由FastMM4处理。但不知怎么的,它似乎忽略了过滤掉已注册的漏洞(这些漏洞是在替换的FastMM中注册的--在调试该BorlndMM.dll时可以看到)。是的,当使用FastMM4.pas时,注册的泄漏不会被报告,但是更改它是不值得争论的。
发布于 2015-02-23 19:53:25
在FastMM4Options.inc中有以下内容:
{$ifdef borlndmmdll}
....
{$undef HideExpectedLeaksRegisteredByPointer}
....HideExpectedLeaksRegisteredByPointer的未定义是导致您所观察到的行为的原因。用定义的borlandmm.dll重新编译替换HideExpectedLeaksRegisteredByPointer,您的预期泄漏将从泄漏报告中被抑制。
但是,据推测,HideExpectedLeaksRegisteredByPointer的意图是未定义的。至于为什么会这样,我不太清楚,但我不能想象皮埃尔不知道这是怎么回事。无论如何,也许定义HideExpectedLeaksRegisteredByPointer是合理的。你也许愿意尝试一下。
https://stackoverflow.com/questions/28679557
复制相似问题