我检查了FastMM4和D6。当我使用"Forms“调试一个简单的应用程序时,每次都有3行内存泄漏。
这个应用程序泄漏了内存。小块泄漏(不包括指针注册的预期泄漏): 13 - 20字节: TObjectList x 3,未知x 3 29 - 36字节: TWinHelpViewer x 1 37 - 52字节: THelpManager x 1
这是正常的吗?
这是哪件事造成的?
谢谢: dd
发布于 2011-02-11 09:42:28
随Delphi 6附带的RTL/VCL包含一些内存泄漏。在Delphi的以后版本中,FastMM的使用导致从RTL/VCL中删除这些内存泄漏。
您需要做的是向FastMM注册这些已知的和预期的内存泄漏。一旦您注册了泄密,FastMM就不会报告它们。尽管这些泄漏是真实存在的,但由于各种原因,最好忽略它们:
这些漏洞唯一重要的情况是,如果您有一个DLL,该DLL在该进程的生命周期内从同一进程加载和卸载了数千次。我不相信这是一个非常现实的情况。
如果您不注册泄漏,那么FastMM泄漏报告很大程度上无效,因为它每次都会显示出来。如果每次你学会忽略它的时候都会显示出来。这种泄漏报告非常有价值,但只有当它显示您可以控制的泄漏时,它才是有价值的。
在我的Delphi6项目中,我的.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-11 09:46:58
我想这是正常的,除非你修补了资料来源。IIRC的作者保存了一张导致内存泄漏的错误列表。“forms es.PAS”,f.i.中的漏洞影响了每个VCL表单的应用。虽然这个产品已经不存在了,但是你可以在'Automated‘site上找到这个列表。这是D6列表。
https://stackoverflow.com/questions/4967432
复制相似问题