4

我用 D6 检查了 FastMM4。当我使用“表单”调试一个简单的应用程序时,我每次都会得到 3 行内存泄漏。

此应用程序已泄漏内存。小块泄漏是(不包括指针注册的预期泄漏):

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

这是正常的吗?

是什么原因造成的?

谢谢:dd

4

2 回答 2

12

Delphi 6 附带的 RTL/VCL 包含一些内存泄漏。在后来的 Delphi 版本中,FastMM 的使用导致这些内存泄漏从 RTL/VCL 中删除。

您需要做的是使用 FastMM 注册这些已知和预期的内存泄漏。一旦您注册了 FastMM 不会报告的泄漏。尽管这些泄漏是真实的,但出于各种原因,最好忽略它们:

  • 从这些已知的 VCL 泄漏中泄漏的内存很小,并且在进程的生命周期内不会增长。
  • 无论如何,只要进程终止,内存就会返回系统。
  • 由于泄漏在您无法控制的代码中,因此您无能为力。您可以修复它们并使用您自己版本的 VCL 单元,但这值得吗?

这些泄漏唯一重要的情况是,如果您有一个 DLL,该 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 中使用的确切单元以及使用它们的方式,您可能需要注册不同的内存泄漏。

于 2011-02-11T09:42:28.727 回答
1

我想这是正常的,除非你修补了源。IIRC,当有“memproof”时,其作者“Atanas Stoyanov”保留了导致内存泄漏的错误列表。'classes.pas' fi 中的泄漏影响了每个 VCL 表单应用程序。虽然该产品已不存在,但您可以在“自动化 QA”网站上找到该列表。这是D6 的列表

于 2011-02-11T09:46:58.223 回答