FastMM4,Delphi6,TApplication泄漏?

时间:2011-02-11 09:31:14

标签: delphi forms memory memory-leaks fastmm

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

  

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

     

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

这是正常的吗?

导致这种情况的原因是什么?

感谢:   DD

2 个答案:

答案 0 :(得分:10)

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中使用的确切单位以及如何使用它们,您可能需要注册不同的内存泄漏。

答案 1 :(得分:1)

我猜这是正常的,除非你修补了消息来源。 IIRC,当有'memproof'时,它的作者'Atanas Stoyanov'保留了导致内存泄漏的错误列表。 'classes.pas',f.i。中的泄漏影响了每个VCL表单应用程序。虽然该产品不再存在,但您可以在“Automated QA”网站上找到该列表。这是list for D6