delphi – 什么时候调用TInterfacedObject.Destroy(一个ScopedLock类)

概述我想知道什么时候TInterfacedObject派生类的实例被销毁,谁调用析构函数.我写了一个ScopedLock类,它应该自动调用Release 实例超出范围时的同步对象的方法.它是从C中知道的RAII概念,但是当锁实例超出范围时,我不知道是否保证调用析构函数. ILock = interfaceend;ScopedLock<T: TSynchroObject> = class(TInt 我想知道什么时候TInterfacedobject派生类的实例被销毁,谁调用析构函数.我写了一个ScopedLock类,它应该自动调用Release
实例超出范围时的同步对象的方法.它是从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类)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1268885.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存