Delphi中实现智能指针

在C++中可以利用栈实现智能指针,可是在Delphi中由于所有的对象都是堆对象,无法利用栈对象。虽然在Delphi2007版本中已经有类似的栈结构,但是仍然不能实现完全意义上的指针。但是Delphi中可以利用另外一样东西实现智能指针--接口。附上源码:
  1. unit AutoPtr;
  2. interface
  3. uses
  4.   SysUtils, SyncObjs;
  5. type
  6.   { TAutoPtrObject - 智能指针对象 }
  7.   TAutoPtrObject = class(TInterfacedObject)
  8.   private
  9.     FObject: TObject;
  10.   public
  11.     constructor Create(AObject: TObject); virtual;
  12.     destructor Destroy; override;
  13.   end;
  14.   { TAutoLockObject - 智能线程锁 }
  15.   TAutoLockObject = class(TInterfacedObject)
  16.   private
  17.     FSection: TCriticalSection;
  18.   public
  19.     constructor Create(ASection: TCriticalSection); virtual;
  20.     destructor Destroy; override;
  21.   end;
  22. function AutoFree(AObject: TObject): IInterface;
  23. function AutoLock(ASection: TCriticalSection): IInterface;
  24. implementation
  25. //------------------------------------------------------------------------------
  26. // 自动释放对象函数(对象必须由外部创建, 离开栈作用域释放)
  27. //------------------------------------------------------------------------------
  28. function AutoFree(AObject: TObject): IInterface;
  29. begin
  30.   Result := TAutoPtrObject.Create(AObject);
  31. end;
  32. //------------------------------------------------------------------------------
  33. // 自动释放线程锁(对象必须由外部创建,离开栈作用域释放)
  34. //------------------------------------------------------------------------------
  35. function AutoLock(ASection: TCriticalSection): IInterface;
  36. begin
  37.   Result := TAutoLockObject.Create(ASection);
  38. end;
  39. { TAutoPtrObject }
  40. constructor TAutoPtrObject.Create(AObject: TObject);
  41. begin
  42.   FObject := AObject;
  43. end;
  44. destructor TAutoPtrObject.Destroy;
  45. begin
  46.   // 智能指针在方法退出时销毁,同时销毁所管理的堆对象
  47.   try FreeAndNil(FObject); except end;
  48.   inherited;
  49. end;
  50. { TAutoLockObject }
  51. constructor TAutoLockObject.Create(ASection: TCriticalSection);
  52. begin
  53.   inherited Create;
  54.   Assert(ASection <> nil);
  55.   FSection := ASection;
  56.   FSection.Enter;
  57. end;
  58. destructor TAutoLockObject.Destroy;
  59. begin
  60.   FSection.Leave;
  61.   inherited;
  62. end;
  63. end.

不过利用接口实现的智能指针经过本人测试,会比较正常Try Finally 要多用一倍的时间。

(出处: http://blog.csdn.net/missmecn/article/details/3016297

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值