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计数减少,变为零并且锁定对象自动销毁. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |