Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#9

Re: [Objekt].Free Frage

  Alt 7. Jul 2004, 23:55
Hallo Christian,

ich habe jenen Titel (lediglich den Vorgänger) von Herrn Kosch leider nicht gelesen, kann aber bestätigen, dass der Delphicompiler bei einem const Paramter keinen Code zur Referenzzählung und den damit verbundenen impliziten Try/Finally-Block generiert.
Dies kann uU einige Nebeneffekte haben, wenn man sich Signaturen der Art
Delphi-Quellcode:
procedure UsesRefCount(AnObject: IInterface);
procedure IgnoresRefCount(const AnObject: IInterface);
ansieht. Sollte man jene Routinen mit Objekten aufrufen, bei denen der Referenzzähler zuvor null betrug, gibt die erste Variante das Objekt selbsständig frei und die vorherige Referenz ist ungültig während die zweite Variante die Verantwortlichkeit des Speicherfreigabe dem Klienten überlässt.
Delphi-Quellcode:
var
  myObject: TInterfacedObject;
begin
  myObject := TInterfacedObject.Create;
  UsesRefCount(myObject);
  // myObject is still<>nil but already freed
  // myObject.Free could cause an error!
gegenüber der Variante 2
Delphi-Quellcode:
var
  myObject: TInterfacedObject;
begin
  myObject := TInterfacedObject.Create;
  try
    IgnoreRefCount(myObject);
    // myObject is untouched and has to be freed!
  finally
    FreeAndNil(myObject);
  end;
Selbiges gilt auch für Strings wobei dies keinen weiteren Eingriff seitens des Programmierers erfordert...
gruß, choose
  Mit Zitat antworten Zitat