
实例超出范围时的同步对象的方法.它是从C中知道的RAII概念,但是当锁实例超出范围时,我不知道是否保证调用析构函数.
ILock = interfaceend;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计数减少,变为零并且锁定对象自动销毁.
总结以上是内存溢出为你收集整理的delphi – 什么时候调用TInterfacedObject.Destroy(一个ScopedLock类)全部内容,希望文章能够帮你解决delphi – 什么时候调用TInterfacedObject.Destroy(一个ScopedLock类)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)