2015-02-23 21 views
5

我有以下例子說明這個問題:如何隱藏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 
--------------------------- 

當我刪除了「壞」內存泄漏一切都很好,沒有報告顯示。但只要有一些意外的內存泄漏,它還會列出註冊的泄漏。

最初我在尋找這些Indy內存泄漏時發現了這個問題,發現它們已經被註冊,但仍然報告了那些真正的內存泄漏。

當我使用內置的ReportMemoryLeaksOnShutdown := True時,它只報告TInterfacedObject的泄漏。

那麼有沒有辦法在完全調試模式下使用FastMM時過濾掉註冊的內存泄漏?


要明確這一點:這是自帶的FastMM拉鍊,其中指出,這是更換爲開箱之一,它使用FastMM4並加載FastMM_FullDebugMode.dll的BorlndMM.dll。所有對內存管理器的調用都由FastMM4來處理。但不知怎的,它似乎忽略了過濾掉註冊的泄漏(在替換BorlndMM.dll中使用FastMM註冊的漏洞 - 在調試該DLL時可以看到)。是的,當使用FastMM4.pas時,不會報告註冊的泄漏信息,但是更改不會引起爭議。

+3

FastMM不應該報告*註冊*泄漏。這是登記他們的全部要點。所以其他事情正在發生。我懷疑'ShareMem'和'BorlndMM.dll'是罪魁禍首。這聽起來好像您可能使用一個FastMM副本在一個模塊中分配內存,但使用另一個FastMM副本將內存註冊到另一個模塊,因此分配模塊不知道註冊模塊的註冊泄漏列表。 – 2015-02-23 17:55:49

回答

5

在FastMM4Options.inc有以下幾點:

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

HideExpectedLeaksRegisteredByPointer的取消定義是什麼原因造成你觀察到的行爲。重新編譯替換borlandmm.dll與HideExpectedLeaksRegisteredByPointer定義和您的預期泄漏將被抑制泄漏報告。

但是,據推測HideExpectedLeaksRegisteredByPointer是打算未定義的。至於爲什麼這是我不確定,但我無法想象皮埃爾意外地未定義它。無論如何,定義HideExpectedLeaksRegisteredByPointer也許是合理的。你可能會考慮嘗試這一點。