FastMM4、Delphi6和TApplication泄漏问题?

4

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

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

13 - 20 bytes: TObjectList x 3, Unknown x 3 29 - 36 bytes: TWinHelpViewer x 1 37 - 52 bytes: THelpManager x 1

这正常吗?

是什么导致了这个问题?

谢谢: dd

2个回答

12

Delphi 6附带的RTL/VCL存在一些内存泄漏。在后续的Delphi版本中,使用FastMM可以消除这些内存泄漏问题。

你需要做的是将这些已知和预期的内存泄漏注册到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中使用的具体单元以及使用方式,您可能需要注册不同的内存泄漏。


关于您的编辑:它们是真正的泄漏。也许,不知道,“只有当它显示您的代码导致的泄漏时才有价值”? - Sertac Akyuz
@Sertac 是的,我明白你的意思。我会澄清一下。 - David Heffernan
这些神奇的数字(36、2、20、7、52)是从哪里来的?我有一个关于对话框的常量内存泄漏问题,我想修复它。 - No'am Newman
@no'am 魔数是在内存泄漏时快速向您报告的东西。 - David Heffernan

1

我猜这是正常的,除非你修补了源代码。如果我没记错的话,在有'memproof'时,它的作者'Atanas Stoyanov'保留了一个导致内存泄漏的错误列表。例如,'classes.pas'中的泄漏会影响每个VCL表单应用程序。虽然该产品已经不存在了,但你可以在'Automated QA'的网站上找到这个列表。这里是D6的列表


1
链接已更改为此链接 - EMBarbosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接