gpt4 book ai didi

delphi - 何时调用 TInterfacedObject.Destroy(ScopedLock 类)

转载 作者:行者123 更新时间:2023-12-03 15:19:45 29 4
gpt4 key购买 nike

我想知道 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超出范围时,其引用计数会递减,变为零,并且锁对象会自动销毁。

关于delphi - 何时调用 TInterfacedObject.Destroy(ScopedLock 类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4389024/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com