gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:00:53 31 4
gpt4 key购买 nike

我有以下示例应用程序显示了该问题:

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 的泄漏。

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

<小时/>

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

最佳答案

在 FastMM4Options.inc 中有以下内容:

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

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

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

关于delphi - 如何隐藏 FastMM 中预期的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28679557/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com