我使用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
我使用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
Delphi 6附带的RTL/VCL存在一些内存泄漏。在后续的Delphi版本中,使用FastMM可以消除这些内存泄漏问题。
你需要做的是将这些已知和预期的内存泄漏注册到FastMM中。一旦完成注册,FastMM就不会报告这些泄漏了。虽然这些泄漏是真实存在的,但出于各种原因最好忽略它们:
这些泄漏仅在同一进程中加载和卸载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中使用的具体单元以及使用方式,您可能需要注册不同的内存泄漏。