Ich frage mich, wenn eine Instanz einer TInterfacedObject abgeleiteten Klasse zerstört wird und wer den Destruktor aufruft. Ich habe eine ScopedLock-Klasse geschrieben, die automatisch die Methode Release eines Synchronisierungsobjekts aufrufen sollte, wenn die Instanz den Gültigkeitsbereich verlässt. Es ist ein RAII-Konzept, das aus C++ bekannt ist, aber ich weiß nicht, ob es garantiert ist, dass der Destruktor aufgerufen wird, wenn die Sperrinstanz den Gültigkeitsbereich verlässt.Wann wird TInterfacedObject.Destroy aufgerufen (eine ScopedLock-Klasse)
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 ?
Es funktioniert gut in einem einfachen Testfall, aber ist es sicher?
Guter Artikel .. Können Sie mir sagen, wie der Delphi-Compiler entscheidet, eine Funktion zu inline oder nicht? Gibt es Methoden, Inlining zu verhindern/durchzusetzen? – hansmaad
@hansmaad: Sofern Sie {$ INLINE AUTO} nicht aktiviert haben, wird eine Funktion, die nicht mit der Inline-Direktive markiert ist, nicht automatisch eingebunden. Aber $ INLINE AUTO verwendet keine sehr intelligente Heuristik - es inline jede Funktion unterhalb einer bestimmten Größe und kann leicht zu einer Größenexplosion führen. Dies bedeutet, dass $ INLINE AUTO wahrscheinlich nicht in Kraft ist. Sie brauchen sich also nur darum zu kümmern, wenn Sie die Funktion zum Inlining mit der Inline-Direktive am Ende des Prozedurheaders selbst markieren. –