我有以下例子說明這個問題:如何隱藏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時,不會報告註冊的泄漏信息,但是更改不會引起爭議。
FastMM不應該報告*註冊*泄漏。這是登記他們的全部要點。所以其他事情正在發生。我懷疑'ShareMem'和'BorlndMM.dll'是罪魁禍首。這聽起來好像您可能使用一個FastMM副本在一個模塊中分配內存,但使用另一個FastMM副本將內存註冊到另一個模塊,因此分配模塊不知道註冊模塊的註冊泄漏列表。 – 2015-02-23 17:55:49