Ste*_*nke 6 delphi memory-leaks fastmm
我有以下示例应用程序,显示问题:
program FalseMemLeak;
uses
ShareMem;
var
o: TObject;
begin
o := TObject.Create; // "good" leak
RegisterExpectedMemoryLeak(o);
TInterfacedObject.Create; // bad leak
end.
Run Code Online (Sandbox Code Playgroud)
我现在使用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
---------------------------
Run Code Online (Sandbox Code Playgroud)
当我删除"坏"内存泄漏一切都很好,没有显示报告.但是一旦出现意外的内存泄漏,它也会列出已注册的泄漏.
最初我在寻找这些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}
....
Run Code Online (Sandbox Code Playgroud)
未定义HideExpectedLeaksRegisteredByPointer
是导致您观察到的行为的原因.使用已HideExpectedLeaksRegisteredByPointer
定义的重新编译替换borlandmm.dll,您的预期泄漏将从泄漏报告中被抑制.
但是,大概HideExpectedLeaksRegisteredByPointer
是未定义的.至于为什么会这样,我不确定,但我无法想象皮埃尔偶然发现它.无论如何,也许定义是合理的HideExpectedLeaksRegisteredByPointer
.您可能会关心这一点.
归档时间: |
|
查看次数: |
1071 次 |
最近记录: |