Delphi - les chaînes des structures ne sont pas libérées [gestionnaire FastMM]
-
05-07-2019 - |
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
?
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.