加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 什么时候调用TInterfacedObject.Destroy(一个ScopedLo

发布时间:2020-12-15 09:39:42 所属栏目:大数据 来源:网络整理
导读:我想知道什么时候TInterfacedObject派生类的实例被销毁,谁调用析构函数.我写了一个ScopedLock类,它应该自动调用Release 实例超出范围时的同步对象的方法.它是从C中知道的RAII概念,但是当锁实例超出范围时,我不知道是否保证调用析构函数. ILock = interfaceen
我想知道什么时候TInterfacedObject派生类的实例被销毁,谁调用析构函数.我写了一个ScopedLock类,它应该自动调用Release
实例超出范围时的同步对象的方法.它是从C中知道的RAII概念,但是当锁实例超出范围时,我不知道是否保证调用析构函数.

ILock = interface
end;

ScopedLock<T: TSynchroObject> = class(TInterfacedObject,ILock)
strict private
    sync_ : T;
public
    constructor Create(synchro : T); reintroduce;
    destructor Destroy;override;
end;

implementation
{ ScopedLock<T> }

constructor ScopedLock<T>.Create(synchro: T);
begin
    inherited Create;;
    sync_ := synchro;
    sync_.Acquire;
end;

destructor ScopedLock<T>.Destroy;
begin
    sync_.Release;
    inherited;
end;

{ Example }
function Example.Foo: Integer;
var
  lock : ILock;
begin
  lock := ScopedLock<TCriticalSection>.Create(mySync);
  // ...
end;  // mySync released ?

它在一个简单的测试用例中运行良好,但是它安全吗?

解决方法

是的,那就是保存.你的代码

function Example.Foo: Integer;
var
  lock : ILock;
begin
  lock := ScopedLock<TCriticalSection>.Create(mySync);
  // ...
end;

编译为以下伪代码

function Example.Foo: Integer;
var
  lock : ILock;
begin
  lock := ScopedLock<TCriticalSection>.Create(mySync);
  lock._AddRef;  // ref count = 1
  try
// .. 
  finally
    lock._Release;  // ref count = 0,free lock object
  end;

您可以看到,当lock var超出范围时,其ref计数减少,变为零并且锁定对象自动销毁.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读