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 :

Liberation foireuse


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut Liberation foireuse
    Salut a tous !

    Je suis sur un prog qui construit et evalue des arbres.

    Mon prog marche (pour l'instant..) mais valgrind en memcheck -v me fait un peu peur..
    Sur un exemple tout con, il m'indique 29 erreurs..
    ==8945== IN SUMMARY: 29 errors from 29 contexts (suppressed: 15 from 1)


    Toutes les erreurs sont dues a la liberation..

    Exemple qui fait foirer :

    on defini une fonction par un arbre avec des parametre :
    f(x,y) = * x y

    et et calcule ensuite
    f@2 1 2
    (@2 pour dire qu'il y a 2 parametres)

    et ca donne 2 (miracle)

    voici une des erreurs valgrind :

    ==8945== 1 errors in context 1 of 29:
    ==8945== Invalid free() / delete / delete[]
    ==8945== at 0x1B903349: free (vg_replace_malloc.c:153)
    ==8945== by 0x804A34D: __libereArbre (analyse.c:1122)
    ==8945== by 0x804A326: __libereArbre (analyse.c:1119)
    ==8945== by 0x804A365: libereArbre (analyse.c:1127)
    ==8945== Address 0x1BA3A620 is 0 bytes inside a block of size 20 free'd
    ==8945== at 0x1B903349: free (vg_replace_malloc.c:153)
    ==8945== by 0x804A34D: __libereArbre (analyse.c:1122)
    ==8945== by 0x804A365: libereArbre (analyse.c:1127)
    ==8945== by 0x804996F: constructionArbre (analyse.c:779)


    ma fonction des liberation :
    void __libereArbre(Arbre a) {
    if(a == NULL ) return;
    __libereArbre(a->fg);
    __libereArbre(a->fd); /*LIGNE 1119*/
    if(a->type == SYMB)
    free(a->contenu.symb);
    free(a); /*LIGNE 1122*/
    return;
    }

    void libereArbre(Arbre * a) {
    __libereArbre(*a);
    *a = NULL;
    return;
    }

    ou faut il que j'aille chercher ?
    dans la construction de l'arbre ?
    Ce sont des lectures or de l'espace alloué ?

    a+

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    T'es sur que ton Arbre a ete alloue avec malloc ?
    Montre ta construction, et mets les balises code

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par D[r
    eadLock]T'es sur que ton Arbre a ete alloue avec malloc ?
    Montre ta construction, et mets les balises code
    En fait, le prog marche bien, c'est juste valgrind qui m'indique ca..
    Et ces erreurs n'arrivent que lorsque que je fait intervenir des symboles dans l'arbre (si seulement operateur et chiffre, no pb)
    mais declarer une variable a à 1 et faire 1 + a provoque les erreurs..

    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
     
    int constructionArbre(Arbre * a, ListeParam lParam)
    /*[...]*/
    else if(analyseSaisieSymboleDroite(mot, lParam, &type, &place) == 0) {
    		switch(type) {
    			case SYMB : {
    				int arite;
    				int i;
    				Symbole s;
     
    				if(analyseSaisieAriteSymbole(&arite) != 0) {
    					fprintf(stderr, " Erreur pendant la saisie de l'arite du symbole\n");
    					return 7;
    				}		
    				if(rechercheTableSymbole(mot, &s) != 0) {
    					if((*a = creerNoeudSymbole(mot)) == NULL) {
    						fprintf(stderr, " Erreur allocation memoire du symbole %s\n", mot);
    						return 8;
    					}
    					return 0;
    				}		
    				for(i=0 ; i<arite ; ++i) {
    					/*ca merde meme avec une arité de 0*/
    				}				
    				*a = s.definition;
     
    				return 0;
    			}
    /*[...]*/
    s.definition est un arbre

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 95
    Points : 66
    Points
    66
    Par défaut
    Ok, le probleme venait de la ligne

    "*a = s.definition;"

    Il faut que je fasse une copie noeud par noeud de l'arbre, la manipulation des pointeurs semblent donc trop hasardeuse pour valgrind..

    tampis !

    Merci a tous pour votre aide et bon reveillon
    a+

Discussions similaires

  1. comment demander a un serveur sql de liberer de la memoire
    Par timsah dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/09/2005, 11h24
  2. [Thread] FreeOnTerminate : Liberation Variable ?
    Par Clorish dans le forum Langage
    Réponses: 4
    Dernier message: 18/02/2005, 15h19
  3. [C#] [Excel] Liberer le processus
    Par lololefada dans le forum Windows Forms
    Réponses: 19
    Dernier message: 11/02/2005, 17h07
  4. Liberer de la place sur le disque dur
    Par olivier639 dans le forum Administration système
    Réponses: 5
    Dernier message: 15/05/2004, 14h03
  5. Objet et liberation de mémoire ...
    Par Mouss26 dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2003, 12h12

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