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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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