Question

Si je déclare

PSomeStruct = ^TSomeStruct;
TSomeStruct = record 
  s1 : string;
end;

et je lance le code suivant:

var
  p: PSomeStruct;
begin
  new(p);
  p^.s1:= 'something bla bla bla';
  dispose(p);

le gestionnaire de mémoire FastMM 4 signale une fuite de mémoire (type: chaîne de caractères, vidage de données: "quelque chose de bla bla bla"). Cependant, si je mets la chaîne s1 à vide avant d'appeler dispose , tout va bien.

La deuxième façon que j'ai trouvée est de passer du type d'enregistrement à la classe, puis au lieu de nouveau , je crée l'instance et au lieu de de disposer , j'appelle instance.Free () . Cela fonctionne sans nettoyer manuellement les chaînes.

Existe-t-il un moyen de faire que Delphi nettoie automatiquement mes chaînes lorsque j'appelle dispose ?

Était-ce utile?

La solution

FastMM est-il la première unité utilisée dans votre fichier .dpr? Sinon, il pourrait être finalisé trop tôt, en signalant de fausses mémoires.

Et cet exemple de code simplifié génère-t-il également le même problème de mémoire que lorsque vous utilisez votre JvSimpleXML? Si ce n’est pas le cas, il se passe probablement plus de choses que vous ne le pensez.

À mon avis: lorsque FastMM signale une fuite de mémoire, il y a une fuite de mémoire.

Autres conseils

Vous faites déjà la bonne chose. Si FastMM dit que la chaîne a fui, FastMM se trompe ou indique une chaîne différente de celle que vous croyez. La procédure Dispose libère les chaînes des enregistrements.

Dans ce cas particulier, il ne devrait pas y avoir de mémoire allouée pour cette chaîne de toute façon. C'est un littéral de chaîne, donc je m'attendrais à ce que le compilateur assigne ce littéral; son nombre de références devrait être -1 et FastMM n'aurait jamais dû le voir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top