我有一个示例应用程序,展示了以下问题:
当我删除“不好的”内存泄漏时,一切都正常,没有报告显示。但是一旦出现意外的内存泄漏,它也会列出已注册的泄漏。
最初,当我寻找这些Indy内存泄漏并发现它们被注册但仍然在真正的内存泄漏中报告时,我发现了这一点。
当我使用内置的
那么,在完整调试模式下使用FastMM时有没有办法过滤掉已注册的内存泄漏呢?
为了澄清这一点:这是FastMM zip附带的BorlndMM.dll,它声明这是用于替换开箱即用的内存管理器,并使用FastMM4并加载FastMM_FullDebugMode.dll。所有对内存管理器的调用都由FastMM4处理。但不知何故,它似乎忽略了过滤已注册的泄漏(这些泄漏是在替换的BorlndMM.dll中由FastMM注册的,可以在调试该DLL时看到)。是的,在使用FastMM4.pas时不会报告已注册的泄漏,但不予讨论更改它。
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时不会报告已注册的泄漏,但不予讨论更改它。
ShareMem
和BorlndMM.dll
有问题。听起来你可能正在一个模块中使用 FastMM 的一个副本分配内存,但在另一个模块中使用不同的 FastMM 副本注册内存,因此分配模块不知道注册模块的已注册泄漏列表。 - Remy Lebeau