Es gibt keine Best Practice. Die primäre Sache, die Sie tun sollten, ist jedoch sicherzustellen, dass immer klar ist, wer für die Zerstörung des Objekts zu einem bestimmten Zeitpunkt verantwortlich ist, selbst wenn eine Ausnahme auftritt.
Es ist nichts falsch daran, dass eine Funktion eine neue Instanz erstellt und zurückgibt. Eine solche Funktion ist ein factory. Sie können es wie den Konstruktor einer Klasse behandeln, also sollten Sie sicherstellen, dass es sich wie ein Konstruktor verhält: Entweder ein gültiges Objekt zurückgeben oder eine Ausnahme auslösen. Es gibt niemals eine Nullreferenz zurück.
function Func: TMyObj;
begin
Result := TMyObj.Create;
try
Result.X := Y;
except
Result.Free;
raise;
end;
end;
Das ist eine Ausnahmebehandlung Muster, das Sie nicht sehr oft sehen, aber es ist für diese Art der Funktion wichtig. Rückgabe des Objekts überträgt Eigentum von der Funktion an den Aufrufer, aber nur wenn es schafft, vollständig auszuführen. Wenn es aufgrund einer Ausnahme vorzeitig verlassen muss, wird das Objekt freigegeben, da der Aufrufer keine Möglichkeit hat, es selbst zu löschen. (Funktionen, die auf eine Ausnahme beenden aufgrund nicht über Rückgabewerte). Der Anrufer es wie folgt verwenden:
O := Func;
try
writeln(O.X);
finally
O.Free;
end;
Wenn es eine Ausnahme in Func
dann O
nie zugewiesen wird, so gibt es nichts für den Anrufer frei.
Wenn der Anrufer das Objekt erstellt und Sie geben es an einem anderen Funktion, es zu initialisieren, ein „var“ Parameter die Parameter nicht machen. Das stellt dem Aufrufer bestimmte Beschränkungen auf, die eine Variable genau des Typs verwenden müssen, der von der Funktion angefordert wird, selbst wenn stattdessen ein Abkömmlingstyp erstellt wurde.
Eine solche Funktion sollte das Objekt nicht freigeben. Der Aufrufer gibt den aufgerufenen Funktionen keine Eigentumsrechte zu, insbesondere wenn er das Objekt nach der Rückgabe der Funktion verwenden möchte.
Dank für das Erhalten mich gerade :) große Antwort –