TStringlist grátis como resultado da função?

Sep 09 2020

Se uma função que chamo retornar a TStringList(com a TStringList.Create) e eu não atribuí-la a uma variável, mas usá-la uma vez diretamente (como Data:=MyTStringFunction.Values['data'];), terei um vazamento de memória ou o TStringList será liberado automaticamente?

Respostas

4 DalijaPrasnikar Sep 09 2020 at 02:53

Se a função criar uma nova lista de strings, seu código vazará.

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

Você precisa armazenar o valor da lista retornada em uma variável e Freedepois de terminar.

var
  List: TStringList;

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

Nota: Como o Delphi 10.3 Rio ainda usa o gerenciamento de objetos ARC para seus compiladores móveis, se o código acima for executado estritamente em plataformas ARC (iOS, Android), ele não vazará. Mas se o código deve ser executado em plataformas não ARC (Windows, Linux, macOS), ou é atualizado para Delphi 10.4, então Freeprecisa ser chamado. Esse código funcionará corretamente em todas as plataformas.