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.
Zeigt da nicht result auf die gleiche Adresse wie sl,
wenn dann sl auf nil gesetz wird, ist dann nicht auch result == nil?
Ja, aber nein:
Sowohl Result als auch sl sind Pointer auf das das Objekt. Wenn ich einen davon auf nil setze, hat das keinen Einfluss auf den anderen. Anders sähe das aus, wenn man sl nicht auf nil setzt:
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;
Dann würde Result nach dem sl.Free auf ein freigegebenes Objekt zeigen und ein Zugriff hätte böse Folgen. Im Besten Fall eine
Access Violation, im schlechtesten Fall würde zufälliger Code ausgeführt.