Delphi 在我的应用程序上运行了一段时间,可能发现内存泄漏

Delphi 在我的应用程序上运行了一段时间,可能发现内存泄漏,delphi,memory-leaks,Delphi,Memory Leaks,我正在运行一个在Windows7下用RAD Studio XE或Delphi XE开发的应用程序。在从以前的项目文件重建应用程序后,我一直在测试它的功能,但该应用程序只会运行大约一个月左右,并开始缓慢失败。除非Windows操作系统出现故障,否则该应用程序应始终全天候运行。因此,我在应用程序上运行了几个小时,并在程序运行时密切关注结果。我注意到的是这个。在其他所有内容不变且数量不变的情况下,在资源分析笔刷下,Handle、Pen和另一支笔的数量正在缓慢增加,尤其是第二支笔和笔刷资源。钢笔的数量似

我正在运行一个在Windows7下用RAD Studio XE或Delphi XE开发的应用程序。在从以前的项目文件重建应用程序后,我一直在测试它的功能,但该应用程序只会运行大约一个月左右,并开始缓慢失败。除非Windows操作系统出现故障,否则该应用程序应始终全天候运行。因此,我在应用程序上运行了几个小时,并在程序运行时密切关注结果。我注意到的是这个。在其他所有内容不变且数量不变的情况下,在资源分析笔刷下,Handle、Pen和另一支笔的数量正在缓慢增加,尤其是第二支笔和笔刷资源。钢笔的数量似乎每秒增加522支。此外,手柄的数量也在增加,但速度非常缓慢-可能每15分钟一次。另一方面:我们的一些用户有 灾难性故障,Windows操作系统将完全死机,您必须重新安装Windows和其他所有设备

AQTime result:
Class_Name     Object_Name
Brush          Brush:54,947
Handle         Handle:44,559  --Handle is increasing slowly
Pen            Pen:53,378   
Pen            Pen:54,915     --Pen is increasing every second by 522. 
应用程序的主窗口将始终显示在屏幕上

更新2:

pen、oldPen-Bursh和oldBursh在基类中声明。在以下过程中,每次都会指定它们,并且整个程序都使用该过程在TForm上绘制元素,如圆、多边形、正方形、直线等

procedure TMakerGraphic.SaveCanvas;
begin
  oldPen.Assign(myForm.Canvas.Pen);
  oldBrush.Assign(myForm.Canvas.Brush);
  myForm.Canvas.Pen.Assign(Pen);
  myForm.Canvas.Brush.Assign(Brush);
end;

procedure TMakerGraphic.RestoreCanvas;
begin
  myForm.Canvas.Pen.Assign(oldPen);
  myForm.Canvas.Brush.Assign(oldBrush);
end;
释放这些变量的唯一时间是删除TForm上的元素时,如以下自由过程所示

destructor TMakerGraphic.Free;
begin
  Pen.Free;
  Brush.Free;
  oldPen.Free;
  oldBrush.Free;
  inherited Free;
end;
那么,这是否意味着我的应用程序正在泄漏内存


任何意见都将不胜感激。谢谢。

钢笔和画笔的实例似乎没有正确释放

如果正在使用TCanvas的内置绘图过程,请使用

Canvas.Pen.Assign(anotherPen)
填写一支新钢笔

如果您通过IGDIPlus使用gdiplus.dll,则每个绘图过程将采用
IGPPen
IGPBrush
参数。因此,要么将要传递的变量声明为
IGPPen/IGPBrush
;或者将它们声明为
TGPPen/TGPBrush
,然后将它们声明为
free

=========================临时示例源代码空间===================

我认为下面的代码,正如OP给出的,不会导致内存/资源泄漏

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;

    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        currPen, prevPen: TPen;
        currBrush, prevBrush: TBrush;

        procedure FormPaint(Sender: TObject);
        procedure FormDestroy(Sender: TObject);

        procedure SaveCanvas;
        procedure RestoreCanvas;

      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      currPen := TPen.Create;
      prevPen := TPen.Create;

      currBrush := TBrush.Create;
      prevBrush := TBrush.Create;

      Self.OnPaint := Self.FormPaint;
      Self.OnDestroy := Self.FormDestroy;
    end;

    procedure TForm1.FormPaint(Sender: TObject);
    begin
      SaveCanvas;
      RestoreCanvas;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      prevPen.Free;
      prevBrush.Free;
      currPen.Free;
      currBrush.free;
    end;

    procedure TForm1.SaveCanvas;
    begin
      prevPen.Assign(Self.Canvas.Pen);
      prevBrush.Assign(Self.Canvas.Brush);
      Self.Canvas.Pen.Assign(currPen);
      Self.Canvas.Brush.Assign(currBrush);
    end;

    procedure TForm1.RestoreCanvas;
    begin
      Self.Canvas.Pen.Assign(prevPen);
      Self.Canvas.Brush.Assign(prevBrush);
    end;

    end.

示例源代码将非常有用。此外,我还为您添加了delphi标记。我希望可以,但我甚至不知道在我的代码中可以查找到哪里。这不是内存泄漏。这是资源泄漏。@David Heffernan:好的。我认为内存泄漏是一个包含资源泄漏的通用术语。资源不是每次创建时都分配给内存吗?@user639464:由于笔和画笔丢失,您可以在创建/分配笔或画笔的位置以及使用它们绘制的位置发布代码。我确实花时间实现了您的基本代码,并在一段时间内运行了它。它没有显示任何正在添加或获取的资源。也许我用错误的方式看待时间结果。我相信AQTime显示的是分配和释放的资源的运行总数,不一定是泄漏的资源。如果我错了,请纠正我。@user639464:关于如何解释AQTime结果,我认为您很可能会从他们的支持中得到满意的结果。但若你们的客户仍然有同样的崩溃问题,你们最好再问一次,把问题放在问题的主题上。对不起,没帮上忙。