随笔 - 33  文章 - 0  评论 - 0  阅读 - 6459

一个简单的垃圾回收程序

 Delphi中对象是有生命期的,创建对象需要占用一定的资源,当对象的生命期结束后,我们需要记住释放这些资源,否则内存中会存在大量的垃圾。Delphi没有提供垃圾自动回收功能,不过Delphi的接口可以通过_AddRef和_Release方法来增减实例计数器,从而实现对象实例的管理,安全销毁不再需要的对象。

  澳大利亚的Malcolm Groves曾经使用Delphi的接口技术写过一个简单的垃圾自动回收程序,这个程序包括了mtReaper和frmMain两个单元,其中mtReaper单元定义了一个名为ImtReaper的接口,其中没有任何方法,仅仅是为了利用接口的实例引用计数器管理功能。这种类型的接口也称为标记(Tag)接口,它的存在表明类能一种特定的方式被使用。mtReaper单元还定义了一个名为TmtReaper的类,它继承于TInterfacedObject类,并实现了ImtReaper接口。我们知道TinterfacedObject类已经实现了IInterface中的一些方法,包括:QueryInterface,_AddRef和_Release方法,这正是我们所需要的。最后在mtReaper单元中还使用了一个构造函数,一个析构函数以及一个类型为TObject的私有变量FObject。在构造函数中,我们将一个对象的引用作为它的参数,并且将该引用保存在私有变量FObject中。FObject随后将对象实例在析构函数中销毁。

unit mtReaper;

interface

type

  ImtReaper=interface

    ['{F3E97960-3F35-11D7-B847-001060806215}']

  end;

TmtReaper=class(TInterfacedObject,ImtReaper)

private

  FObject:TObject;

public

  constructor Create(AObject:TObject);

  destructor Destroy;override;

end;

implementation

uses SysUtils;

cosntructor TmtReaper.Create(AObject:TObject);

begin

  FObject:=AObject;

end;

destructor TmtReaper.Destroy;

begin

  FreeAndNil(FObject);

  Inherited;

end;

end.

 

unit frmMain;

interface

uses

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

type

  TNoisyDeath=class(TObject)

  public

    destructor Destroy;override;

  end;

TForm1=class(TForm)

  Button1:TButton;

  Button2:TButton;

  procedure Button1Click(Sender:TObject);

  procedure Button2Click(Sender:TObject);

private

  procedure WaitAWhile;

public

  {Public declarations}

end;

var

  Form1:TForm1;

implementation

{$R *.dfm}

destructor TNoisyDeath.Destroy;

begin

  ShowMessage('对象销毁了!');

  inherited;

end;

procedure TForm1.WaitAWhile;

var

  i:Integer;

begin

  for i:=0 to 5000 do

  begin

    Caption:=inttostr(i);

  end;

end;

//常规销毁对象

procedure TForm1.Button1Click(Sender:TObject);

var

  NoisyDeath:TNoisyDeath;

begin

  NoisyDeath:=TNoisyDeath.Create;

  try

    WaitAWhile;

  finally

    NoisyDeath.Free;

  end;

end;

//利用接口来管理对象

procedure TForm1.Button2Click(Sender:TObject);

var

  NoisyDeath:TNoisyDeath;

  girm:ImtReaper;

begin

  NoisyDeath:=TNoisyDeath.Create;

  girm:=TmtReaper.Create(NoisyDeath);

  WaitAWhile;

end;

end.

 

posted on   Delphi搬运工  阅读(162)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示