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 :

probléme de mémoire (double free).


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut probléme de mémoire (double free).
    Bonjour ,

    J'ai un problème assez étrange .

    il me met double free qu'a partir du 9 , fichier importimage.c : 207

    Si je l'éxecute avec valgrind aucun problème .

    voici les sources :
    - main.c : ici .
    - importimage.c : ici
    - importimage.h :ici


    Merci d'avance .

    nb : j'ai hésité a le poster sur le forum gtk mais le problème ne semble pas venir de gtk+ .

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ouhhhh beaucoup de choses...

    J'ai pas regardé le main, mais juste dans importimage :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        if (stream == NULL)
    	return -1;
        struct StructMemoire *mem = stream;
    Pas C89/90. Pas d'instructions AVANT des déclarations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        mem->memoire = realloc(mem->memoire, realsize + mem->taille + 1);
        if (mem->memoire == NULL)
    	return -2;
    Pas de pointeur intermédiaire. Si allocation échoue, impossible de libérer ce qui était déjà alloué.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        mem->memoire[mem->taille] = 0;
    Pas forcément la meilleur manière de mettre à NULL..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tab = malloc(12 * sizeof (*tab));
    tab2 = malloc(12 * sizeof (*tab2));
    Pas de vérifications que les alloc se soeitn bien passées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i=0;i<12;i++)
    {
    	tab[i] = malloc(80 * sizeof (char));
    	tab2[i] = malloc(80 * sizeof (char));
    }
    idem



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      for(i=0;i<12;i++)
      {
    	fprintf(stderr,"liberation : %d\n",i);
    	fprintf(stderr,"liberation : %p\n",tab2[i]);
    	free(tab2[i]);
    idem


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free(tab2);
    tab2 =NULL ;
    pas dans le if ( tab2 != NULL )

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par souviron34
    ouhhhh beaucoup de choses...

    J'ai pas regardé le main, mais juste dans importimage :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        if (stream == NULL)
    	return -1;
        struct StructMemoire *mem = stream;
    Pas C89/90. Pas d'instructions AVANT des déclarations.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        mem->memoire = realloc(mem->memoire, realsize + mem->taille + 1);
        if (mem->memoire == NULL)
    	return -2;
    Pas de pointeur intermédiaire. Si allocation échoue, impossible de libérer ce qui était déjà alloué.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        mem->memoire[mem->taille] = 0;
    Pas forcément la meilleur manière de mettre à NULL..


    ce code n'est pas de moi mais des développeurs de libcurl : ici

    Mais c'est corrigé .

    Citation Envoyé par souviron34

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tab = malloc(12 * sizeof (*tab));
    tab2 = malloc(12 * sizeof (*tab2));
    Pas de vérifications que les alloc se soeitn bien passées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i=0;i<12;i++)
    {
    	tab[i] = malloc(80 * sizeof (char));
    	tab2[i] = malloc(80 * sizeof (char));
    }
    idem



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      for(i=0;i<12;i++)
      {
    	fprintf(stderr,"liberation : %d\n",i);
    	fprintf(stderr,"liberation : %p\n",tab2[i]);
    	free(tab2[i]);
    idem


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free(tab2);
    tab2 =NULL ;
    pas dans le if ( tab2 != NULL )


    Corrigé



    Mais cela ne résout pas mon problème , j'ai édité les liens .

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    d'abord le truc du realloc n'est pas corrigé..

    Ensuite je ne connais pas libcurl, mais quand je vois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    curl_easy_setopt(curl,CURLOPT_WRITEDATA,(void *) &memoire_s);
    .... 
    curl_easy_perform(curl);
    ....
     
    free(begin);
    memoire_s.memoire = NULL;
     
    ....
    curl_easy_cleanup(curl);
    Que fait easy_setopt ? ça alloue la mémoire ?
    Que fait easy_cleanup ? ça désalloue pas la mémoire ?
    Si oui, alors ne pas faire free(begin)....

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par souviron34
    d'abord le truc du realloc n'est pas corrigé..


    Que fait easy_setopt ? ça alloue la mémoire ?
    Que fait easy_cleanup ? ça désalloue pas la mémoire ?
    Si oui, alors ne pas faire free(begin)....

    1) Non cela ajoute une donné au callback (memorycallback).
    2) Ouai celle allloué par curl_easy_init .
    3) begin n'as aucun rapport avec libcurl .



    J'ai remarqué que le problème vient de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(i=0;i<12;i++)
      {
    	fprintf(stderr,"liberation : %d\n",i);
    	fprintf(stderr,"liberation : %p\n",tab2[i]);
    	free(tab2[i]);
    	tab2[i]=NULL ;
     
      }

    au bout de la 9ème itération : baam


    liberation : 9
    liberation : 0x5e67c0
    *** glibc detected *** ./importimage: double free or corruption (!prev): 0x00000000005e67c0 ***



    EDIT : Une chaine beaucoup trop longue a déclenché une corruption de la mémoire.
    .


    Merci de ton aide souviron , je vais m'occuper de ce realloc .

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

Discussions similaires

  1. Problème de libération de mémoire avec free()
    Par Nival dans le forum Débuter
    Réponses: 8
    Dernier message: 18/03/2009, 23h06
  2. 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
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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