Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1797 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [Résolu] Fuite mémoire détecté par Valgrind

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Fuite mémoire détecté par Valgrind

n°2278525
Loulou4672
Posté le 28-03-2016 à 11:34:59  profilanswer
 

Bonjour,
 
j'ai implémenté une skiplist pour un devoir maison, Valgrind détecte des fuite mémoires, comme si j'écrasai un pointeur alloué :
 

Code :
  1. typedef struct s_Node *Node;
  2. struct s_Node {
  3. unsigned int nblevels;
  4. int value;
  5. Node *prevs;
  6. Node *nexts;
  7. };
  8. Node node_create(unsigned int nblevels, int value) {
  9. Node node = (Node) malloc(sizeof(struct s_Node));
  10. checkPointer(node);
  11. node->nblevels = nblevels;
  12. node->value = value;
  13. node->nexts = (Node *) malloc(nblevels * sizeof(Node)); //ICI
  14. checkPointer(node->nexts);
  15. node->prevs = (Node *) malloc(nblevels * sizeof(Node)); //ICI
  16. checkPointer(node->prevs);
  17. for (unsigned int i = 0; i < nblevels; ++i) {
  18.  node->nexts[i] = node;
  19.  node->prevs[i] = node;
  20. }
  21. return node;
  22. }


 
node->nexts et node-> prevs sont pas encore alloué donc je vois pas de problème, quelqu'un à une idée ?
 
Merci d'avance


Message édité par Loulou4672 le 28-03-2016 à 13:14:19
mood
Publicité
Posté le 28-03-2016 à 11:34:59  profilanswer
 

n°2278528
Farian
Posté le 28-03-2016 à 12:09:19  profilanswer
 

Bonjour !  
 
La fuite mémoire que repère valgrind vient du fait que les pointeurs nexts et prevs ne sont jamais désalloués durant la vie du programme : quand ce dernier se termine, les blocs mémoire sont toujours alloués => fuite.  
 
Il faut que vous regardiez comment vous vous servez du retour de la fonction et comment vous désallouez les pointeurs qui chaînent (doublement) votre liste.
 
Bonne continuation !


---------------
On n'est jamais très fort pour ce calcul !
n°2278529
Loulou4672
Posté le 28-03-2016 à 12:14:22  profilanswer
 

J'ai une fonction pour libérer aussi :
 

Code :
  1. void node_delete(Node node) {
  2. free(node->nexts);
  3. free(node->prevs);
  4. free(node);
  5. node = NULL;
  6. }

n°2278530
Loulou4672
Posté le 28-03-2016 à 12:53:26  profilanswer
 

J'ai trouvé, c'était con :
 

Code :
  1. void skiplist_delete(SkipList d) {
  2.     Node itr = d->sentinel;
  3.     do {
  4.         Node tmp = NODE_NEXT(itr);
  5.         node_delete(itr); // Ici j'avais mis "free(itr)"
  6.         itr = tmp;
  7.     } while (itr != d->sentinel);
  8.     free(d);
  9.     d = NULL;
  10. }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [Résolu] Fuite mémoire détecté par Valgrind

 

Sujets relatifs
[Qt][QML] QObject du C++ vers le QML: gestion mémoireConcommation mémoire variables php
libération mémoireAllocation Mémoire pour tableau 2 dimensions
C++11 éclaircissement sur la gestion de la mémoireCommande affichant la quantité de mémoire
[VBA] Collections et Objets - Quand et comment vider la mémoire[C] Détails allocation mémoire
Moyen le plus rapide de copier une grosse table SQL en mémoire ?taille d'une page mémoire
Plus de sujets relatifs à : [Résolu] Fuite mémoire détecté par Valgrind


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR