TStringlist gratuit comme résultat de la fonction?

Sep 09 2020

Si une fonction que j'appelle renvoie un TStringList(avec a TStringList.Create) et que je ne l'assigne pas à une variable mais que je l'utilise une fois directement (comme Data:=MyTStringFunction.Values['data'];), aurai-je une fuite de mémoire ou la TStringList sera-t-elle automatiquement libérée?

Réponses

4 DalijaPrasnikar Sep 09 2020 at 02:53

Si la fonction crée une nouvelle liste de chaînes, votre code fuit.

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

Vous devez stocker la valeur de la liste retournée dans une variable et Freecela une fois que vous avez terminé.

var
  List: TStringList;

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

Remarque: étant donné que Delphi 10.3 Rio utilise toujours la gestion d'objets ARC pour ses compilateurs mobiles, si le code ci-dessus s'exécute strictement sur les plates-formes ARC (iOS, Android), il ne fuira pas. Mais si le code doit s'exécuter sur des plates-formes non ARC (Windows, Linux, macOS), ou est déjà mis à niveau vers Delphi 10.4, il Freedoit être appelé. Un tel code fonctionnera correctement sur toutes les plates-formes.