Man gibt normalerweise mit Funktionen keine Objekte zurück
Solange klar ist, dass der Aufrufer sie freigeben muss, warum nicht?
Delphi-Quellcode:
sl := FunctionDieEineStringlistErzeugt(bla, blub);
try
Verarbeite(sl);
finally
sl.Free;
end;
funktioniert prima.
Problematisch ist eher die erzeugende Function selbst, denn was, wenn nach dem Erzeugen der Stringlist eine
Exception ausgelöst wird?
Delphi-Quellcode:
function FunctionDieEineStringlistErzeugt(bla, blub:
string): TStringList;
begin
Result := TStringList.Create;
Result.Add(bla);
Result.Add(blub);
raise Exception.Create('
Test');
end;
Und schwupps hat man ein Leak. Natürlich ist das nie so offensichtlich wie in diesem Beispiel.
Meine Lösung dafür sieht so aus:
Delphi-Quellcode:
function FunctionDieEineStringlistErzeugt(bla, blub:
string): TStringList;
begin
Result := TStringList.Create;
try
Result.Add(bla);
Result.Add(blub);
raise Exception.Create('
Test');
except
Result.Free;
raise;
end;
end;
Ich bin mir allerdings sicher, dass das irgendwie eleganter gehen müsste.
Edit: Mir ist gerade noch eine Alternative eingefallen:
Delphi-Quellcode:
function FunctionDieEineStringlistErzeugt(bla, blub:
string): TStringList;
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.Add(bla);
sl.Add(blub);
raise Exception.Create('
Test');
Result := sl;
sl :=
nil;
finally
sl.Free;
end;
end;
Ist aber auch nicht wirklich elegant.