Im Falle von Delphi, [...], würde ich auf solche Tricks wie Smart Pointer komplett verzichten.
Weshalb verzichten? Und wieso ist das ein "Trick"? Ohne gegenseitige Benachrichtigung bei Freigabe von Objekten würde die ganze
VCL nicht funktionieren...
Die
VCL verwendet keine Tricks sondern nur den etablierten Weg über Komponenten.
DAS hier ist ein Trick (in dem die Referenzzählung eines Interface ausgenützt wird):
Delphi-Quellcode:
unit UAutoRelease;
interface
{**************************************************************************
* NAME: AutoRelease
* DESC: Gibt das übergebene Objekt automatisch beim Verlassen der
* aktuellen Funktion frei.
* PARAMS: obj: TObject
* RESULT: IUnknown
*
* Hilfsfunktion, um Objekte automatisch beim Verlassen der aktuellen
* Funktion freizugeben.
* Damit kann man sich manche try .. finally Blöcke sparen.
* Beispiel:
* procedure xyz;
* var sl: TStringList;
* t : IUnknown;
* begin
* sl := TStringList.Create;
* t := AutoRelease(sl);
* sl.LoadFromFile('c:\autoexec.bat');
* ...
* // sl.Free wird nicht mehr benötigt!!!
* end;
*************************************************************************}
function AutoRelease(obj: TObject): IUnknown;
implementation
type
TAutoReleaseObject =
class(TInterfacedObject, IUnknown)
private
FObject: TObject;
public
constructor Create(obj: TObject);
destructor Destroy;
override;
end;
constructor TAutoReleaseObject.Create(obj: TObject);
begin
inherited Create;
FObject := obj;
end;
destructor TAutoReleaseObject.Destroy;
begin
FObject.Free;
inherited;
end;
function AutoRelease(obj: TObject): IUnknown;
begin
Result := TAutoReleaseObject.Create(obj);
end;
end.
Delphi-Quellcode:
finalization
MeinGlobalesObjekt.Free;
end.
Wo ist das Problem?
Das Problem ist, dass man globale Objekte vermeiden sollte wann immer es möglich ist.
Manchmal lässt es sich nicht vermeiden ein Objekt global anzulegen, aber jedes globale Objekt erzeugt auch Probleme wie schlechte Testbarkeit.
Wenn Projekte an Umfang zunehmen und Hunderte von Units haben ist jedes globale Objekt eine
technische Schuld für die man "Zinsen" bezahlen muss.