Delphi 在我的应用程序上运行了一段时间,可能发现内存泄漏
我正在运行一个在Windows7下用RAD Studio XE或Delphi XE开发的应用程序。在从以前的项目文件重建应用程序后,我一直在测试它的功能,但该应用程序只会运行大约一个月左右,并开始缓慢失败。除非Windows操作系统出现故障,否则该应用程序应始终全天候运行。因此,我在应用程序上运行了几个小时,并在程序运行时密切关注结果。我注意到的是这个。在其他所有内容不变且数量不变的情况下,在资源分析笔刷下,Handle、Pen和另一支笔的数量正在缓慢增加,尤其是第二支笔和笔刷资源。钢笔的数量似乎每秒增加522支。此外,手柄的数量也在增加,但速度非常缓慢-可能每15分钟一次。另一方面:我们的一些用户有 灾难性故障,Windows操作系统将完全死机,您必须重新安装Windows和其他所有设备Delphi 在我的应用程序上运行了一段时间,可能发现内存泄漏,delphi,memory-leaks,Delphi,Memory Leaks,我正在运行一个在Windows7下用RAD Studio XE或Delphi XE开发的应用程序。在从以前的项目文件重建应用程序后,我一直在测试它的功能,但该应用程序只会运行大约一个月左右,并开始缓慢失败。除非Windows操作系统出现故障,否则该应用程序应始终全天候运行。因此,我在应用程序上运行了几个小时,并在程序运行时密切关注结果。我注意到的是这个。在其他所有内容不变且数量不变的情况下,在资源分析笔刷下,Handle、Pen和另一支笔的数量正在缓慢增加,尤其是第二支笔和笔刷资源。钢笔的数量似
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结果,我认为您很可能会从他们的支持中得到满意的结果。但若你们的客户仍然有同样的崩溃问题,你们最好再问一次,把问题放在问题的主题上。对不起,没帮上忙。