Delphi 如何找出我的应用程序在哪里泄漏内存?
我正在使用下面的类Delphi 如何找出我的应用程序在哪里泄漏内存?,delphi,Delphi,我正在使用下面的类 mycalss = class public Self.timer1: TTimer; Self.abitmap: tbitmap; Self.animage: TImage; Self.formxyz:form; //some other declaration //also having my own constructor and destructor overridde
mycalss = class
public
Self.timer1: TTimer;
Self.abitmap: tbitmap;
Self.animage: TImage;
Self.formxyz:form;
//some other declaration
//also having my own constructor and destructor overridden
end;
单击一个按钮时,将创建myclass1,单击其他按钮时,myclass1将被销毁
begin
FreeAndNil(Self.timer1) ;
FreeAndNil(Self.abitmap) ;
FreeAndNil(Self.animage);
//others
Self.formxyz.Close ;
FreeAndNil(Self.formxyz);
FreeAndNil(Self) ;
inherited Destroy;
end;
每当我单击“创建”按钮时,windows任务管理器显示内存消耗增加了800 kb,每当我单击“销毁”时,内存消耗只减少了500 kb
我很确定,当我的应用程序是一个简单的应用程序时,大小的增加是在创建时发生的(不是因为其他副作用)
问题:我是否可以期望delphi应用程序删除创建的所有对象(~800kb),以便在销毁操作时删除(如果我已正确释放)?。第一个在类中分配的唯一可用对象-不要销毁自变量 这在调用inherited时会有一些好的副作用,而inherited类也希望释放一些东西 检查内存泄漏的唯一可靠方法是启用ReportMemoryLeaksOnShutdown或 更好的方法是从sourceforge下载FastMM源代码 其次,我认为您遇到了内部内存管理器的一个特长—内部内存管理器只释放非常大的分配块的内存。从内部来看,内存管理器基本上由3个块管理器组成,一个小型块管理器、一个中型块管理器和一个小型块管理器
大块头的管理者。对于中小型块,管理器保留内存,不会将其释放给windows—在不久的将来重用内存的可能性相当高。它只会立即释放大数据块的内存。您的构造函数和析构函数应该如下所示:
constructor TMyClass.Create(AOwner: TComponent);
begin
inherited;
timer1:= TTimer.Create;
Bitmap1:= TBitmap.Create;
AnImage:= TImage.Create(AOwner);
...
end;
destructor TMyClass.Destroy;
begin
timer1.Free;
abitmap.Free;
animage.Free;
inherited Destroy;
end;
因为您没有重用任何成员,所以调用FreeAndNil是没有意义的 实际上,若销毁对象,那个么在销毁过程中只能调用Free()。只有在需要重新分配变量时,才可以使用FreeAndNil()。
FreeAndNil(Self)
这部分肯定是错误的。另外,通常最好在构造函数末尾调用inherited destroy
。将“ReportMemoryLeaksOnShutdown:=True”放入.dpr文件并检查。它将显示内存泄漏,如果您发布了实际代码,它将有所帮助。不是这样。将ReportMemoryLeaksOnShutdown
设置为True
,让FastMM向您报告内存泄漏。如果需要详细报告,请安装完整的FastMM。不要依赖任务管理器中引用的数字来诊断内存泄漏。虚拟内存是复杂的。内存管理器很复杂。第一步是让FastMM帮助您。最后,我对你上一个问题的回答有什么问题?If可能无法解决您的实际问题,但它是您所问问题的答案。