Einzelnen Beitrag anzeigen

xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Function Result ist Klasse Wie freigeben?

  Alt 14. Aug 2006, 11:11
Hallo,
Zitat von Jürgen Thomas:
Zitat von Alexander Roth:
und wenn man es nicht created dann zeigt anscheinend result auf old.
Nein: Wenn der Befehl "result:=Tstringlist.Create;" nicht ausgeführt werden soll, zeigt Result "irgendwohin" und führt in "irgendeiner Prozedur" sehr schnell zu Zugriffsverletzungen.
Das stimmt nicht ganz. Wenn in einer Funktion nichts gemacht wird, dann zeigt Result tatsächlich auf das erste Argument (in diesem Fall Old), da sowohl das erste Argument als auch Result in EAX liegen.

Aber zurück zum Topic:
Grundsätzlich gibt es immer zwei Varianten: Entweder ein Objekt als Argument übergeben (nicht als var) oder als Result erhalten. In beiden Fällen ist aber die aufrufende Funktion dafür verantwortlich, dass das Objekt am Ende freigegeben wird. Der einzige Unterschied besteht hier in der Lesbarkeit. Denn bei der Variante "Argument" muss ich das Objekt vorher selbst anlegen und weiß damit auch, dass ich es selbst zerstören muss. Bei der anderen Variante muss ich das zwar auch, aber es ist nicht offensichtlich. Außerdem kann ich mir bei einer Blackbox (was eine Funktion möglichst sein sollte) eben nicht sicher sein, ob ich nicht nur eine Referenz auf ein internes Objekt erhalte. Das darf ich dann nämlich nicht freigeben.
Die oben angesprochene Variante mit var, bei der das Objekt in dern Funktion erzeugt wird, ist nichts anderes als eine Variante von "Result".

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat