Kostenlose TStringlist als Funktionsergebnis?

Sep 09 2020

Wenn eine von mir aufgerufene Funktion a TStringList(mit a TStringList.Create) zurückgibt und ich sie keiner Variablen Data:=MyTStringFunction.Values['data'];zuordne, sondern sie einmal direkt verwende (wie ), liegt dann ein Speicherverlust vor oder wird die TStringList automatisch freigegeben?

Antworten

4 DalijaPrasnikar Sep 09 2020 at 02:53

Wenn die Funktion eine neue Zeichenfolgenliste erstellt, leckt Ihr Code.

function MyTStringFunction: TStringList;
begin
  // constructing new string list
  Result := TStringList.Create;
  ...
end;

Sie müssen den Wert der zurückgegebenen Liste in einer Variablen speichern Free, nachdem Sie fertig sind.

var
  List: TStringList;

List := MyTStringFunction;
try
  Data := List.Values['data'];
finally
  List.Free;
end;

Hinweis: Da Delphi 10.3 Rio weiterhin die ARC-Objektverwaltung für seine mobilen Compiler verwendet, tritt kein Leck aus, wenn der obige Code ausschließlich auf ARC-Plattformen (iOS, Android) ausgeführt wird. Wenn der Code jedoch auf Nicht-ARC-Plattformen (Windows, Linux, macOS) ausgeführt werden muss oder jemals auf Delphi 10.4 aktualisiert wird, Freemuss er aufgerufen werden. Dieser Code funktioniert auf allen Plattformen ordnungsgemäß.