如何找出我的应用程序泄漏内存的位置?

时间:2011-11-18 09:09:55

标签: 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 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)(如果我已正确释放)?。

2 个答案:

答案 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是没有意义的。