0 votes

fuites de mémoire apparaissant après plusieurs chargements

J'ai un, du moins pour moi, cas étrange ici : J'ai un programme relativement simple qui charge un fichier XML depuis le web, l'analyse et écrit les données dans un tableau de dictionnaires. Chaque dictionnaire représente une ligne du tableau. Le programme fonctionne bien et si j'attache mon simulateur aux instruments et charge la liste, il n'y a pas de fuite de mémoire.

Maintenant, voici la partie étrange : Il existe un bouton permettant à l'utilisateur de recharger la liste. Si vous appuyez dessus, les données précédentes sont effacées, le XML est à nouveau téléchargé et analysé, et ainsi de suite. Si j'appuie sur ce bouton, je ne peux toujours pas trouver de fuite de mémoire. Pourtant, si j'appuie deux fois sur ce bouton, il y a soudainement des fuites tout autour. Je suis très perplexe, comment se fait-il qu'il y ait soudainement des fuites là où il n'y en avait pas auparavant (les fuites n'apparaissent que si le même code est exécuté deux fois) ? C'est d'autant plus étrange que j'utilise une partie de l'exemple de XMLParser d'Apple par exemple, mon code est une copie 1:1 du leur, pourtant quand j'exécute le parseur deux fois, les instruments signalent une fuite dans ce code.

Je suis heureux de recevoir de l'aide, car je ne sais pas vraiment comment m'y prendre. Le code devrait être correct. J'ai déjà essayé "Build and Analyze", il ne révèle rien que je ne verrais pas non plus dans les instruments.

Tous mes vœux, Robin

1voto

David Gladfelter Points 2756

Il n'y a vraiment pas assez d'informations ici pour donner une réponse solide.

Cela dit, il semble que vous interprétiez mal les résultats de l'outil de détection des fuites de mémoire que vous utilisez. S'il analyse le graphe des objets à la recherche d'objets orphelins, il se peut qu'il ne remarque pas qu'un objet est orphelin avant que vous ne le rechargiez. C'est parce qu'il peut y avoir une référence statique en cache à la racine du graphe d'objets dans l'une des bibliothèques tierces que vous utilisez (ou dans votre propre code). Une fois que vous rechargez, la référence en cache est déplacée vers le nouvel objet racine et tous les anciens objets ne sont plus référencés par aucune variable racine (variables locales sur la pile d'appels ou variables statiques) et sont donc orphelins et "fuient".

0voto

Mr-sk Points 5604

Le programme fonctionne bien et si je joins mon simulateur aux instruments et que je charge la liste, il n'y a pas de fuite de mémoire.

Cela ne veut pas dire que vous devez pas de fuites - Les instruments peuvent ne pas les attraper - ils échantillonnent toutes les n/secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X