如何在FastMM中隐藏预期的内存泄漏?

时间:2015-02-23 17:22:44

标签: delphi memory-leaks fastmm

我有以下示例问题的示例应用程序:

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时未报告已注册的泄漏,但更改内容并不适合辩论。

1 个答案:

答案 0 :(得分:5)

在FastMM4Options.inc中有以下内容:

{$ifdef borlndmmdll}
  ....
  {$undef HideExpectedLeaksRegisteredByPointer}
....

HideExpectedLeaksRegisteredByPointer的取消定义是导致您观察到的行为的原因。重新编译已定义HideExpectedLeaksRegisteredByPointer的替换borlandmm.dll,您的预期泄漏将从泄漏报告中被抑制。

但是,大概HideExpectedLeaksRegisteredByPointer是未定义的。至于为什么会这样,我不确定,但我无法想象皮埃尔偶然发现它。无论如何,定义HideExpectedLeaksRegisteredByPointer也许是合理的。您可能会尝试使用它。