0 votes

erreurs free() (débogage avec valgrind) ?

J'ai ces structures :

typedef struct _Frag{
  struct _Frag *next;
  char *seq;
  int x1; 
  int length;  
}Frag;

typedef struct _Fragment{ 
  int type; 
  Frag *frag_list;   
}Fragment;

J'ai ensuite créé un tableau

Fragment *fragments=malloc(1,sizeof(Fragment)); // or more
fragments->frag_list=malloc(1,sizeof(Frag)); // or more
Frag *frag=malloc(10,sizeof(Frag));
frag->seq="test str\n";
...
frag->next=malloc(1,sizeof(Frag));
frag->next->seq="test str\n";

A la fin du programme, je veux libérer la mémoire, la fonction est :

static void free_frags(){
  int i;
  Fragment *fragment;
  Frag *current,*next;
  for(i=0;i<1;i++){
    fragment=&snp_frags[i];
    current=fragment->frag_list;
    next=current->next;

    while(next!=NULL){
      free(current->seq);
      //free(current->next);
      free(current);
      current=next;
      next=current->next;
    }
    free(current->seq);
    //free(current->next);
    free(current);
    //free(fragment->frag_list);
    free(&snp_frags[i]);
  }
  free(snp_frags);
}

Si j'utilise valgrind pour le déboguer, valgrind dit cela :

=============================================
==3810== Invalid read of size 4
==3810==    at 0x80490FD: free_snp (hap.c:16)
==3810==    by 0x80493AF: main (hap.c:73)
==3810==  Address 0x41b139c is 12 bytes inside a block of size 296 free'd
==3810==    at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810==    by 0x8049167: free_snp (hap.c:30)
==3810==    by 0x80493AF: main (hap.c:73)
==3810== 
==3810== Invalid free() / delete / delete[]
==3810==    at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810==    by 0x8049167: free_snp (hap.c:30)
==3810==    by 0x80493AF: main (hap.c:73)
==3810==  Address 0x41b1398 is 8 bytes inside a block of size 296 free'd
==3810==    at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810==    by 0x8049167: free_snp (hap.c:30)
==3810==    by 0x80493AF: main (hap.c:73)

Et s'il vous plaît, aidez-moi à corriger ces erreurs, merci.

7voto

sharptooth Points 93379

En

frag->seq="test str\n";

vous n'avez pas malloc 'ed le bloc de mémoire - la chaîne est allouée dans le stockage statique - et plus tard, vous essayez d'utiliser le bloc de mémoire. free() ce bloc de mémoire. Vous pouvez seulement free() blocs alloués avec malloc() sinon vous risquez d'avoir un comportement non défini.

Vous pouvez soit placer uniquement des pointeurs vers des chaînes de caractères allouées de manière statique dans Frag::seq les champs et jamais free() ou vous pourriez malloc() pour ces chaînes de caractères et les copier dans la mémoire de l malloc Les blocs "ed".

1voto

DigitalRoss Points 80400

Vous semblez dire que vous libérez cette mémoire comme la dernière chose que fait le programme.

Pourquoi s'en préoccuper ? Pourquoi ne pas simplement sortir ? Votre désallocation sera alors parfaite et plus rapide. C'est d'ailleurs la technique recommandée.

Je suis certain qu'aucun commentateur ne pourra citer un exemple de système d'exploitation qui ne libère pas les ressources mémoire des programmes qui se terminent. Sans cette fonctionnalité essentielle du système d'exploitation, ^C, kill, le gestionnaire de tâches, les bogues de programmes, les plantages de programmes ... chaque terminaison anormale entraînerait des fuites de mémoire.

1voto

Chris Lutz Points 34157
  1. Vous appelez souvent molloc() au lieu de malloc() . Vérifiez vos voyelles.
  2. Vous appelez malloc() avec le mauvais nombre d'arguments - il n'en faut qu'un.
  3. Il n'est pas possible d'assigner des chaînes de caractères. pointeur ce qui n'est pas ce que vous souhaitez. Vous devez utiliser strcpy() o strncpy() o memcpy() en fonction de votre perspective religieuse sur l'ensemble *cpy() pour copier le contenu d'une chaîne dans une autre.

0voto

Charlie Epps Points 663

Supprimer la ligne de code "free(fragment)". Cela fonctionnera bien.

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