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

How to hide expected memory leaks in 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   
---------------------------

当我删除 "bad" 内存泄漏时,一切正常,没有显示任何报告。但是一旦出现一些意外的内存泄漏,它也会列出已注册的泄漏。

最初我在寻找这些 Indy 内存泄漏时发现了这一点,发现它们已注册但仍被报告为真正的内存泄漏。

当我使用内置 ReportMemoryLeaksOnShutdown := True 时,它只报告 TInterfacedObject 的泄漏。

那么在完全调试模式下使用 FastMM 时,有没有办法过滤掉已注册的内存泄漏?


要明确这一点:这是 FastMM zip 附带的 BorlndMM.dll,它声明这是开箱即用的替代品,它使用 FastMM4 并加载 FastMM_FullDebugMode.dll.因此,所有对内存管理器的调用都由 FastMM4 处理。但不知何故,它似​​乎忽略了过滤掉已注册的泄漏(在替换 BorlndMM.dll 中使用 FastMM 注册 - 在调试该 DLL 时可以看到)。是的,使用 FastMM4.pas 时不会报告已注册的泄漏,但改变它是没有争议的。

在FastMM4Options.inc中有以下内容:

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

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

但是,大概 HideExpectedLeaksRegisteredByPointer 是未定义的。至于为什么会这样,我不确定,但我无法想象 Pierre 会无意中取消定义它。不管怎样,定义HideExpectedLeaksRegisteredByPointer或许是合理的。您可能愿意尝试一下。