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 :

Mauvaise gestion de la memoire {arbre, tas}


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut Mauvaise gestion de la memoire {arbre, tas}
    Bonjour a vous tous,
    Voila j'ai un petit problème d'environ 16 non-free lorsque je le teste avec valgrind... Pour un petit programme comme ca...
    Si vous pouviez m'indiquer ce qui ne convient pas
    Merci d'avance

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <stdio.h>
    #include <stdlib.h>
    #define max(a,b)((a>b)?a:b)
     
    /* structure recursive pour un arbre binaire */
    typedef struct noeud
    {
     char Info;
     struct noeud *FilsG;
     struct noeud *FilsD;
    } Noeud, *Arbre;
     
    typedef struct table
    {
     int n;
     char *t;
    }Table;
     
    void DetruireArbre (Arbre a)
    {
     if (!a) return;
     DetruireArbre (a->FilsG);
     DetruireArbre (a->FilsD);
     free(a);
     a=NULL;
    }
     
    Arbre DeTableVersArbreBis (Table *tab, int i)
    {
     Arbre a = malloc(sizeof(Noeud));
     if (!a){printf ("erreur allocation memoire de l'arbre\n"); return NULL;}
     if (i>=tab->n) {free (a); return NULL;}
     a->Info = tab->t[i];
     a->FilsG = DeTableVersArbreBis(tab,2*i+1);
     a->FilsD = DeTableVersArbreBis(tab,2*i+2);
     return a;
    }
     
    Arbre DeTableVersArbre (Table *tab)
    {
     return DeTableVersArbreBis(tab,0);
    }
     
    void DetruireTable (Table *tab)
    {
     if (!tab) return;
     free (tab->t);
     free (tab);
    }
     
    int main (int argc, char *argv[])
    {
     Table *tab = malloc (sizeof (Table));
     tab->n=7;
     tab->t = malloc (sizeof(char)*tab->n);
     
     tab->t[0]='A';
     tab->t[1]='B';
     tab->t[2]='C';
     tab->t[3]='D';
     tab->t[4]='E';
     tab->t[5]='F';
     tab->t[6]='G';
     
     Arbre a = DeTableVersArbre(tab);
     
     DetruireArbre (a);
     DetruireTable (tab);
     return EXIT_SUCCESS;
    }

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    valgrind t'indique normalement où est alloué ce qui n'est pas désaoullé. Donc nous envoyer le rapport de valgrind pourrait être utile

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    Pour le rapport de valgrind, il faut le faire avec une option particuliere?Car pour le moment je ne vois pas ou ca peut etre indiqué, je ne vois pas de numéros de lignes...
    Je pense que c'est mon arbre qui n'est pas desalloué, car ma table est correctement desalloué (j'ai teste avec valgrind sans l'arbre)

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Faut compiler en -g et sans les optimisations (-O0)

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    Le rapport de valgrind... Ca me parle pas trop a moi si tu arrives a en tirer des informations, pourrais tu m'expliquer... merci

    supp: 11 Debian libc6 (2.3.x) stripped dynamic linker
    ==4560== malloc/free: in use at exit: 192 bytes in 16 blocks.
    ==4560== malloc/free: 18 allocs, 2 frees, 207 bytes allocated.
    ==4560==
    ==4560== searching for pointers to 16 not-freed blocks.
    ==4560== checked 59,544 bytes.
    ==4560==
    ==4560== LEAK SUMMARY:
    ==4560== definitely lost: 192 bytes in 16 blocks.
    ==4560== possibly lost: 0 bytes in 0 blocks.
    ==4560== still reachable: 0 bytes in 0 blocks.
    ==4560== suppressed: 0 bytes in 0 blocks.
    ==4560== Use --leak-check=full to see details of leaked memory.
    --4560-- memcheck: sanity checks: 0 cheap, 1 expensive
    --4560-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
    --4560-- memcheck: auxmaps: 0 searches, 0 comparisons
    --4560-- memcheck: SMs: n_issued = 7 (112k, 0M)
    --4560-- memcheck: SMs: n_deissued = 0 (0k, 0M)
    --4560-- memcheck: SMs: max_noaccess = 65535 (1048560k, 1023M)
    --4560-- memcheck: SMs: max_undefined = 0 (0k, 0M)
    --4560-- memcheck: SMs: max_defined = 20 (320k, 0M)
    --4560-- memcheck: SMs: max_non_DSM = 7 (112k, 0M)
    --4560-- memcheck: max sec V bit nodes: 1 (0k, 0M)
    --4560-- memcheck: set_sec_vbits8 calls: 1 (new: 1, updates: 0)
    --4560-- memcheck: max shadow mem size: 416k, 0M
    --4560-- translate: fast SP updates identified: 1,571 ( 90.4%)
    --4560-- translate: generic_known SP updates identified: 83 ( 4.7%)
    --4560-- translate: generic_unknown SP updates identified: 83 ( 4.7%)
    --4560-- tt/tc: 3,258 tt lookups requiring 3,281 probes
    --4560-- tt/tc: 3,258 fast-cache updates, 2 flushes
    --4560-- transtab: new 1,626 (33,591 -> 563,095; ratio 167:10) [0 scs]
    --4560-- transtab: dumped 0 (0 -> ??)
    --4560-- transtab: discarded 0 (0 -> ??)
    --4560-- scheduler: 26,642 jumps (bb entries).
    --4560-- scheduler: 0/1,753 major/minor sched events.
    --4560-- sanity: 1 cheap, 1 expensive checks.
    --4560-- exectx: 30,011 lists, 26 contexts (avg 0 per list)
    --4560-- exectx: 31 searches, 5 full compares (161 per 1000)
    --4560-- exectx: 0 cmp2, 26 cmp4, 0 cmpAll

  6. #6
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Je vois deux endroits suspects:
    • Dans DetruireArbre (Arbre a):
      Tu voulais sans doute inverser ce test : if (a) return;
    • Dans DeTableVersArbreBis:
      Ta 3eme ligne te fait renvoyer NULL sans liberer a.

    Ensuite, dans ton main(), tu ne vérifies pas le retour de malloc.

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Essaye avec les options "--leak-check=full --show-reachable=yes"

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Ma librairie de trace de malloc/free/realloc/calloc me donne le log suivant :

    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
     
    +|0x009111e0|12          |12          |main.c          |62    
    +|0x00912270|20          |8           |main.c          |63    
    +|0x009122b8|27          |7           |main.c          |65    
    +|0x00912300|39          |12          |main.c          |34    
    +|0x00912350|51          |12          |main.c          |34    
    +|0x009123a0|63          |12          |main.c          |34    
    +|0x009123f0|75          |12          |main.c          |34    
    +|0x00912440|87          |12          |main.c          |34    
    +|0x00912490|99          |12          |main.c          |34    
    +|0x00915008|111         |12          |main.c          |34    
    +|0x00915058|123         |12          |main.c          |34    
    +|0x009150a8|135         |12          |main.c          |34    
    +|0x009150f8|147         |12          |main.c          |34    
    +|0x00915148|159         |12          |main.c          |34    
    +|0x00915198|171         |12          |main.c          |34    
    +|0x009151e8|183         |12          |main.c          |34    
    +|0x00915238|195         |12          |main.c          |34    
    +|0x00915288|207         |12          |main.c          |34    
    -|0x009122b8|200         |7           |main.c          |51    
    -|0x00912270|192         |8           |main.c          |52    
    !|number of alloc       = 18           times
    !|number of free        = 2            times
    !|number of realloc     = 0            times
    !|total size allocated  = 207          bytes
    !|total size freed      = 15           bytes
    !|unfreed memory        = 192          bytes
    le format est le suivant : opération [+/-/~] (malloc/free/realloc), adresse, total alloué au moment de l'appel, taille de la mémoire de l'adresse concernée de l'appel, fichier source , la ligne de code

    18 malloc pour 2 free ! bonjour les fuites :

    Les malloc non suivis de free :

    ligne 34 :le mallloc de a DeTableVersArbreBis (15 occurences)
    ligne : le malloc de a dans main() (1 occurence)..
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    Merci pour vos reponses
    • Dans DetruireArbre (Arbre a):
      J'ai effectivement inverser le test Une fois remplacé, je passe a 9 not-free

    • Dans DeTableVersArbreBis:
      J'ai rajouté un free(a) au niveau de if (i>=tab->n) {free (a);return NULL;}.
    Je suis donc passé a 1 not-free mais je ne comprends pas qu'au tant de place soit liberé grace a ceci...
    • Pour le dernier free, qui se trouve apparemment dans le main, je ne comprends pas lequel sa peut etre. Car le a est desalloue dans DetruireArbre, et tab dans DetruireTable...non?


    Merci encore pour votre aide !!

  10. #10
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par line86 Voir le message
    Pour le dernier free, qui se trouve apparemment dans le main, je ne comprends pas lequel sa peut etre. Car le a est desalloue dans DetruireArbre, et tab dans DetruireTable...non?[/LIST]
    Dans ton main, tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Arbre a = malloc (sizeof (Noeud)); 
    /* ... */
     a = DeTableVersArbre(tab);
    /* ... */
    Du coup, tu perds l'adresse allouée au début par malloc, non ?

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Par défaut
    Merciiii je commence a mieux comprendre grace a vous!!!
    Merci pour vos reponses !

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

Discussions similaires

  1. gestion de la memoire en java
    Par jojob dans le forum Langage
    Réponses: 15
    Dernier message: 16/10/2006, 17h04
  2. Gestion de la mémoire.
    Par nicolas_faf dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 27/03/2006, 16h58
  3. [JVM]Gestion de la mémoire
    Par Crypt dans le forum Général Java
    Réponses: 20
    Dernier message: 31/12/2005, 14h33
  4. firefox - mauvaise gestion des passwords
    Par photorelief dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/06/2005, 09h02
  5. [Doc] arbres/tas binomiaux
    Par loul91 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/01/2005, 23h09

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