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可能无法解决您的实际问题,但它是您所问问题的答案。