gpt4 book ai didi

delphi - FastMM4、Delphi6、TApplication 泄漏?

转载 作者:行者123 更新时间:2023-12-03 15:18:06 26 4
gpt4 key购买 nike

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

This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

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

这正常吗?

什么原因导致这个?

谢谢: dd

最佳答案

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

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

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

这些泄漏唯一可能发生的情况是,如果您的 DLL 在该进程的生命周期内从同一进程加载和卸载了数千次。我不认为这是一个非常现实的场景。

如果您不注册泄漏,那么 FastMM 泄漏报告在很大程度上会变得无效,因为它每次都会显示。如果每次你学会忽略它时都会出现。此泄漏报告非常有值(value),但只有当它显示您可以控制的泄漏时才有值(value)。

在我的 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 中使用的具体单元以及使用它们的方式,您可能需要注册不同的内存泄漏。

关于delphi - FastMM4、Delphi6、TApplication 泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com