IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Erreur] double free or corruption


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut [Erreur] double free or corruption
    Bonjour,
    je sollicite votre aide car j'ai l'erreur double "free or corruption (out)" quand j'essaye d'utiliser la fonction free (pourtant je mets bien mes pointeurs à NULL après chaque free).

    Voila la bout de code en question (avec toutes les lignes ou la variable en question est utilisé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    typedef struct
    {
    	int id;
    	double d;
    } neighbor;
     
    [...]
     
    void ma_fonction(...)
    {
          neighbor *k_best=NULL;
          k_best=(neighbor*)malloc(k*sizeof(neighbor));
          for(...)
          {
                 for(i=0;i<k;i++)
                 {
                        k_best[i].id=-1;
    	            k_best[i].d=DBL_MAX;
                 }
                 [...]
                 for (i=0;i<ds[0];i++)
    	     {
    		   tmp_dist=dist(predict[p],data[i],ds[1]-1);
    		   if (k_best[0].d>tmp_dist)
    		   {
    			 k_best[0].d=tmp_dist;
    			 k_best[0].id=i;
    			 qsort (k_best,k, sizeof(neighbor), cmp);
    		    }
    	     }
                 [...]
          }
          free(k_best);
          k_best=NULL;
    }
    Vous avez des idées sur l'origine du problème?
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je ne vois pas d'erreur, mais
    - es-tu sûr que k est non nul positif ?
    - tu ne teste pas le retour du malloc
    - l'erreur est sans doute dans les [...] : Tu dois bien te servir du tableau k_best après qsort(), sinon qsort() ne servirait à rien.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse.
    Oui le k est bien toujours positif et j'ai rajouté un test sur le malloc.
    En effet, comme tu dis je réutilise bien k_best après qsort() sinon ca n'aurait aucun intérêt mais je ne fait aucune modification sur ce tableau en dehors des lignes que j'avais noté. Voila les lignes manquantes en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for(i=0;i<k;i++)
    {
           c=data[k_best[j].id][ds[1]-1];
           p[c]+=k_best[j].d;
           cpt[c]++;
    }
    Sinon, encore plus étrange, dans mon programme j'ai un paramètre qui influe sur le nombre de fois où cette fonction sera appelé et suivant sa valeur j'ai l'erreur "double free or curruption (out)" ou non.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Il est difficile de répondre car le code que tu donnes n'est pas complet.

    Peut être faut-il envisager une destruction indirecte de k_best par exemple par dépassement d'un buffer ce qui écraserait sa valeur et l'erreur n'aurait alors rien à voir avec le mécanisme malloc/free proprement dit ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(i=0;i<k;i++)
    {
           c=data[k_best[j].id][ds[1]-1];
           p[c]+=k_best[j].d;
           cpt[c]++;
    }
    c'est normal ce j ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Effectivement, je pense que c'est un problème de ce genre là. Je n'ai pas tout à fait localisé le problème mais visiblement j'ai un indice, qui me sert à faire des affectations dans un autre tableau, qui n'est pas correct et provoque un débordement.

    Sinon pour le j, c'était en faite un i, j'ai juste recopié mon code un peu vite.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Voila, le problème est résolu. Pour tous ceux qui aurait le même problème:
    j'avais un autre tableau déclaré ailleurs dans mon programme qui était contigu en mémoire avec mon tableau k_best. Je faisais un dépassement de 1 dans ce premier tableau lors d'une affectation, ce qui a entrainé cette erreur lors du free(k_best).

    Merci beaucoup pour ton aide diogene.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/05/2010, 23h57
  2. Réponses: 6
    Dernier message: 20/03/2009, 10h05
  3. [SFML] Image double free or corruption
    Par Belegkarnil dans le forum SFML
    Réponses: 4
    Dernier message: 23/08/2007, 16h56
  4. erreur glibc detected double free or corruption.
    Par Screwt-K dans le forum C++
    Réponses: 1
    Dernier message: 02/07/2007, 16h46
  5. Problème d'éxécution: double free or corruption
    Par ciol_tebroc dans le forum C++
    Réponses: 3
    Dernier message: 17/05/2006, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo