簡體   English   中英

FastMM4,Delphi6,TApplication泄漏?

[英]FastMM4, Delphi6, Leak of TApplication?

我用D6檢查了FastMM4。 當我使用“Forms”調試一個簡單的應用程序時,我每次都有3行內存泄漏。

此應用程序已泄露內存。 小塊泄漏(不包括指針注冊的預期泄漏):

13 - 20字節:TObjectList x 3,未知x 3 29 - 36字節:TWinHelpViewer x 1 37 - 52字節:THelpManager x 1

這是正常的嗎?

哪件事導致了這個?

謝謝:dd

Delphi 6附帶的RTL / VCL包含一些內存泄漏。 在Delphi的后續版本中,使用FastMM導致從RTL / VCL中刪除這些內存泄漏。

您需要做的是使用FastMM注冊這些已知和預期的內存泄漏。 一旦您注冊了FastMM將不會報告它們的泄漏。 雖然這些泄漏是真實的,但出於各種原因,它們最好被忽略:

  • 這些已知VCL泄漏的泄漏記憶很小,並且在過程的生命周期內不會增長。
  • 一旦進程終止,內存就會返回系統。
  • 由於泄漏是在您無法控制的代碼中,因此您無法做到這一點。 您可以修復它們並使用您自己版本的VCL單元,但值得嗎?

這些泄漏可能最重要的唯一一次是,如果您在該過程的生命周期中有一個DLL在相同的進程中加載​​和卸載了數千次。 我不相信這是一個非常現實的場景。

如果您沒有注冊泄漏,那么FastMM泄漏報告在很大程度上是無效的,因為它每次都會顯示。 如果每次你學會忽略它就會顯示出來。 這種泄漏報告非常有價值,但只有當它顯示您可以控制的泄漏時才有價值。

在我的Delphi 6項目中,我在.dpr文件中有以下代碼:

// Register expected VCL memory leaks caused by Delphi unit HelpIntfs.
FastMM4.RegisterExpectedMemoryLeak(36, 2); // THelpManager x 1, THTMLHelpViewer x 1
FastMM4.RegisterExpectedMemoryLeak(20, 7); // TObjectList x 3, THelpSelector x 1, Unknown x 3
FastMM4.RegisterExpectedMemoryLeak(52);    // TWinHelpViewer x 1

我還在TForm后代中有以下內容,我的應用程序中的所有表單都從該后代下降:

var
  ExpectedHelpStringMemoryLeakRegistered: Boolean;

procedure TMyForm.WMHelp(var Message: TWMHelp);
begin
  if not (biHelp in BorderIcons) and not ExpectedHelpStringMemoryLeakRegistered then begin
    // Register expected VCL memory leaks caused by Delphi unit HelpIntfs.
    FastMM4.RegisterExpectedMemoryLeak(44); // TString x 1
    ExpectedHelpStringMemoryLeakRegistered := True;
  end;
  inherited;
end;

根據您在RTL / VCL中使用的確切單位以及如何使用它們,您可能需要注冊不同的內存泄漏。

我猜這是正常的,除非你修補了消息來源。 IIRC,當有'memproof'時,它的作者'Atanas Stoyanov'保留了導致內存泄漏的錯誤列表。 'classes.pas',fi中的泄漏影響了每個VCL表單應用程序。 雖然該產品不再存在,但您可以在“Automated QA”網站上找到該列表。 這是D6列表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM