Moin Mysterio,
Generell weiß ich natürlich, wie man Objekte erstellt und wieder freigibt. Nur nicht, wenn der Rückgabewert ein Objekt, wie z.B. TStringList, ist.
Genau deshalb sollte man es vermeiden ein Objekt als Rückgabewert einer Funktion zu verwenden.
Es wird zu unübersichtlich. Man kann sich dabei zu leicht Speicherlecks, oder Exceptions auf Grund an falscher Stelle freigegebener Objekte einhandeln.
Eine Ausnahme fällt mir dazu aber auch noch ein:
Wenn es sich um eine Methode einer Klasse handelt, die die zurückgegebenen Objekte selber verwaltet, z. B. TListView.
TListView verwaltet die Items selber, so dass TListItem als Rückgabewert von TListView.Items.Add kein Problem darstellt.
Delphi-Quellcode:
function funktion: TStrings;
begin
Result := TStringlist.Create;
try
Result.Add('Eins');
Result.Add('Zwei');
except
FreeAndNil(Result);
raise;
end;
end;
Oder habe ich noch nicht richtig verstanden, was "raise" macht?
Raise ruft die
Exception auf Grund derer in den except-Zweig verzweigt wurde noch einmal auf.
Erst wird die
Exception abgefangen (try/except), dann das Objekt freigegeben (FreeAndNil(Result)) und dann der Grund für den Fehler erneut angezeigt (raise).