我正在使用以下课程
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,每当我点击破坏时,只有500kb减少,
我很确定尺寸增量是在创建时发生的(不是因为其他副作用)因为我的应用程序很简单。
问题:我是否可以期望delphi应用程序删除在destroy操作中创建的所有对象(~800kb)(如果我已正确释放)?。
答案 0 :(得分:1)
首先只在类中分配的自由对象 - 不要破坏自变量 在调用inherited时会有一些很好的副作用,而且继承的类也想要释放东西。
检查内存泄漏的唯一可靠方法是启用ReportMemoryLeaksOnShutdown或 甚至更好 - 从sourceforge下载FastMM源代码。
其次我认为你遇到了内部内存管理器的特性 - 内部内存管理器只释放非常大的已分配块的内存。从内部看,它揭示了内存管理器基本上由3个块管理器组成,一个小块,一个中等和一个 大块经理。对于中小型块,管理器保留内存并且不会将其释放到窗口 - 它将在不久的将来重用的可能性非常高。它只会立即为大块释放内存。
答案 1 :(得分:1)
您的构造函数和析构函数应如下所示:
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是没有意义的。