首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我的应用程序上运行AQTime,可能发现内存泄漏

在我的应用程序上运行AQTime,可能发现内存泄漏
EN

Stack Overflow用户
提问于 2011-03-12 00:11:38
回答 1查看 569关注 0票数 1

我正在运行一个在Windows 7下使用RAD Studio XE或Delphi XE开发的应用程序。从以前的项目文件重建我的应用程序后,我一直在测试它的功能,但该应用程序只运行了大约一个月左右,并且开始缓慢失败。此应用程序应始终全天候运行,除非Windows操作系统出现故障。因此,我在应用程序上运行了几个小时的AQTime,并密切关注程序运行时的结果。我注意到的是这个。在其他一切都保持不变的情况下,在资源分析下,Brush、Handle、Pen和another Pen的数量正在缓慢增加,特别是第二个pen和Brush资源。笔会的数量似乎每秒增加约522个。此外,句柄数量正在上升,但速度非常慢-可能每15分钟一次。顺便说一句:我们的一些用户遇到了灾难性的故障,Windows操作系统将完全死亡,以至于您必须重新安装Windows和其他所有东西。

代码语言:javascript
复制
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. 

应用程序的主窗口将始终显示在屏幕上。

UPDATE2:

pen、oldPen Bursh和oldBursh是在基类中声明的。它们在下面的过程中每次都会被赋值,该过程在整个程序中用于在TForm上绘制元素,如圆、多边形、正方形、线条等。

代码语言:javascript
复制
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上的元素时,才会释放这些变量,如下面的Free过程所示。

代码语言:javascript
复制
destructor TMakerGraphic.Free;
begin
  Pen.Free;
  Brush.Free;
  oldPen.Free;
  oldBrush.Free;
  inherited Free;
end;

那么,这是不是意味着我的应用程序正在泄漏内存?

我们将非常感谢您的任何意见。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-12 00:27:48

似乎没有正确释放Pen和Brush的实例。

如果您使用的是TCanvas的内置绘图过程,请使用

代码语言:javascript
复制
Canvas.Pen.Assign(anotherPen)

来填一支新笔。

如果通过IGDIPlus使用gdiplus.dll,则每个绘制过程都将采用IGPPenIGPBrush参数。因此,要么将要传递的变量声明为IGPPen/IGPBrush;,要么将它们声明为TGPPen/TGPBrush,然后对它们执行free操作。

================= temporary空间中的示例源代码==========

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

代码语言:javascript
复制
    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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5275387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档