TStringlist grátis como resultado da função?
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
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.