Je me demande quand une instance d'une classe dérivée de TInterfacedObject est détruite et qui appelle le destructeur. J'ai écrit une classe ScopedLock, qui devrait automatiquement appeler la méthode Release d'un objet de synchronisation lorsque l'instance sort de la portée. C'est un concept RAII connu en C++, mais je ne sais pas s'il est garanti que le destructeur est appelé, quand l'instance de verrouillage sort de sa portée.Quand TInterfacedObject.Destroy est appelé (une classe 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 ?
Cela fonctionne très bien dans un cas de test simple, mais est-ce sécuritaire?
Bon article .. Pouvez-vous me dire comment le compilateur Delphi décide d'intégrer une fonction ou non? Existe-t-il des méthodes pour empêcher/appliquer inline? – hansmaad
@hansmaad: Si {$ INLINE AUTO} n'est pas activé, il n'introduira jamais automatiquement une fonction non marquée avec la directive inline. Mais $ INLINE AUTO n'utilise pas une heuristique très intelligente - elle va intégrer toutes les fonctions en dessous d'une certaine taille, et peut facilement conduire à une explosion de taille. Cela signifie qu'il est peu probable que $ INLINE AUTO soit en vigueur. Ainsi, vous n'avez besoin de vous en soucier que si vous marquez vous-même la fonction de ligne avec la directive 'inline' à la fin de l'en-tête de la procédure. –