Je cours valgrind pour rechercher des fuites de mémoire. J'ai alloué deux variables globales dans la fonction principale; puis, à la fin de main
je libre à la fois, mais Valgrind écrit motive:Valgrind et variables globales
==18311== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311== by 0x804A30C: main (application.c:730)
==18311==
==18311== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2
==18311== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311== by 0x804A31D: main (application.c:731)
Résumé des fuites:
==18311== LEAK SUMMARY:
==18311== definitely lost: 32 bytes in 2 blocks
==18311== indirectly lost: 0 bytes in 0 blocks
==18311== possibly lost: 0 bytes in 0 blocks
==18311== still reachable: 0 bytes in 0 blocks
==18311== suppressed: 0 bytes in 0 blocks
Pourquoi je ne peux pas libérer ces deux variables?
Modifier
someList *something; *something_else;
La structure utilisée comporte deux champs de type et un champ char *
someList *next
. Plus tard, il y a beaucoup de code. Quelques threads vont ajouter/modifier/supprimer des objets en utilisant ces deux variables.
something -> object 1 -> ... -> object n
something_else -> object 1 -> ... -> object m
Où ->
signifie que something->next = object 1
et object k
sont toutes les instances de someList *
.
Vers la fin de l'application, j'ai libéré tous les champs de chaque élément object k
. Puis, dans la dernière partie:
free(something);
free(something_else);
Il est possible que j'ai oublié de libérer un champ d'un objet. Cela peut-il causer le comportement que j'ai ici?
J'espère que c'est plus clair maintenant. Etes-vous sûr de vouloir désallouer toutes vos variables?
La partie du code dans laquelle vous les libérez est-elle exécutée? Un retour anticipé de la fonction principale peut l'ignorer. – CodesInChaos
Besoin de voir le code. – SoapBox
@CodeInChaos oui: le code est exécuté. Merci quand même. – Donovan