と呼ばれています。私は、インスタンスがスコープの外に出たときに自動的に同期オブジェクトのリリース メソッドを呼び出す必要がありScopedLockクラスを、書きました。これは、C++から知られているRAIIの概念ですが、ロックインスタンスがスコープ外に出たときにデストラクタが呼び出されることが保証されているかどうかはわかりません。はいつTInterfacedObject.DestroyがTInterfacedObjectは、派生クラスのインスタンスが破棄されたとき、私は思ったんだけど、誰がデストラクタを呼び出す(ScopedLockクラス)
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 ?
単純なテストケースでは問題なく動作しますが、安全ですか?
良い記事..デルファイコンパイラが関数をインライン化する方法を教えてください。インライン化を防止/実施する方法はありますか? – hansmaad
@hansmaad:あなたが持っている場合を除き、{$ INLINE AUTO}アクティブ、それが自動的にインライン指令でマークされていない機能をインライン化することはありません。しかし、$ INLINE AUTOは非常にスマートなヒューリスティックを使用していません - それはあるサイズ以下のすべての関数をインライン化し、簡単にサイズの爆発につながります。つまり、$ INLINE AUTOが有効になることはほとんどありません。したがって、プロシージャヘッダーの最後にあるインラインディレクティブを使用してインライン展開の機能をマークしておくと、心配する必要はありません。 –