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

7
我有一个示例应用程序,展示了以下问题:
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时不会报告已注册的泄漏,但不予讨论更改它。

3
FastMM 不应报告已 注册 的泄漏。这就是注册它们的全部意义所在。因此,肯定发生了其他问题。我怀疑 ShareMemBorlndMM.dll 有问题。听起来你可能正在一个模块中使用 FastMM 的一个副本分配内存,但在另一个模块中使用不同的 FastMM 副本注册内存,因此分配模块不知道注册模块的已注册泄漏列表。 - Remy Lebeau
1个回答

6
在FastMM4Options.inc文件中,有以下内容:
{$ifdef borlndmmdll}
  ....
  {$undef HideExpectedLeaksRegisteredByPointer}
....

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

然而,可能HideExpectedLeaksRegisteredByPointer是打算未定义的。至于为什么这样做,我不确定,但我无法想象Pierre是无意中未定义它的。无论如何,也许定义HideExpectedLeaksRegisteredByPointer是合理的。您可以尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接