Kostenlose TStringlist als Funktionsergebnis?
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
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äß.