【发布时间】:2015-04-25 02:49:09
【问题描述】:
我有以下显示问题的示例应用程序:
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
---------------------------
当我删除“坏”内存泄漏时,一切都很好,并且没有显示任何报告。但是一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。
最初我在寻找这些 Indy 内存泄漏时发现了这一点,发现它们已注册但仍然报告在真正的内存泄漏中。
当我使用内置的ReportMemoryLeaksOnShutdown := True 时,它只报告TInterfacedObject 的泄漏。
那么在完全调试模式下使用 FastMM 时,有没有办法过滤掉注册的内存泄漏?
为了明确这一点:这是 FastMM zip 附带的 BorlndMM.dll,它声明这是开箱即用的替代品,它使用 FastMM4 并加载 FastMM_FullDebugMode.dll。因此,对内存管理器的所有调用都由 FastMM4 处理。但不知何故,它似乎忽略了过滤掉已注册的泄漏(在替换 BorlndMM.dll 中使用 FastMM 注册 - 在调试该 DLL 时可以看到)。是的,在使用 FastMM4.pas 时不会报告已记录的泄漏,但改变这一点没有争议。
【问题讨论】:
-
FastMM 不应该报告 已注册 泄漏。这就是注册它们的全部意义所在。所以其他事情正在发生。我怀疑
ShareMem和BorlndMM.dll是罪魁祸首。这听起来像是您可能使用 FastMM 的一个副本在一个模块中分配内存,但使用 FastMM 的不同副本在另一个模块中注册内存,因此分配模块不知道注册模块的已注册泄漏列表。
标签: delphi memory-leaks fastmm