Einzelnen Beitrag anzeigen

Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.604 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: noch was zu: "Nach 20/30 starts aus der IDE speicher voll"

  Alt 17. Okt 2023, 08:11
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.
Thomas Mueller

Geändert von dummzeuch (17. Okt 2023 um 08:15 Uhr)
  Mit Zitat antworten Zitat