TStringlist gratuito come risultato della funzione?

Sep 09 2020

Se una funzione che chiamo restituisce a TStringList(con a TStringList.Create) e non la assegno a una variabile ma la uso direttamente una volta (come Data:=MyTStringFunction.Values['data'];) avrò una perdita di memoria o TStringList verrà liberato automaticamente?

Risposte

4 DalijaPrasnikar Sep 09 2020 at 02:53

Se la funzione crea un nuovo elenco di stringhe, il codice verrà perso.

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

È necessario memorizzare il valore dell'elenco restituito in una variabile e Freedopo aver finito.

var
  List: TStringList;

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

Nota: poiché Delphi 10.3 Rio utilizza ancora la gestione degli oggetti ARC per i suoi compilatori mobili, se il codice sopra viene eseguito rigorosamente su piattaforme ARC (iOS, Android), non verrà fuoriuscito. Ma se il codice deve essere eseguito su piattaforme non ARC (Windows, Linux, macOS) o viene aggiornato a Delphi 10.4, è Freenecessario richiamarlo. Tale codice funzionerà correttamente su tutte le piattaforme.