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 :

Effacer un arbre binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 31
    Par défaut Effacer un arbre binaire
    Bonjour à tous,

    J'ai mis en oeuvre un arbre binaire en m'appuyant sur le tuto du site: http://chgi.developpez.com/arbre/binaire/
    Tout à l'air de fonctionner correctement à la compil, à l'éxectution.
    Cependant, j'ai un soucis lorsque je passe PURIFY: un FMR est détecté au passage de la fonction clearArbre (FMR: Free Memory Read)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void clearTree(node **tree)
    {
        node *tmpTree = *tree;
     
        if(!tree) return;
     
        if(tmpTree->left)  clearTree(&tmpTree->left);
     
        free(tmpTree);
     
        if(tmpTree->right) clearTree(&tmpTree->right);     <---PROBLEME
        *tree = NULL;
    }
    Visiblement, le soucis se passe à la ligne indiqué ci-dessus. Je pense que le problème vient du fait que le tmpTree est libérer puis qu'on appelle tmpTree->right par la suite.
    A première vue, je peux comprendre qu'il râle. Mais en fait non, en y réfléchissant je ne vois pas pourquoi puis après le free, le pointeur tmpTree->right existe.
    C'est d'ailleurs conforté par le fait que l'éxecution à l'air de bien se passer.
    Pourriez-vous m'éclairer?

    De plus, tant que j'y suis, pourriez-vous m'expliquer l'intéret d'introduire tmpTree au lieu d'utiliser directement tree?

    Je vous remercie par avance et vous souhaite une bone aprem'

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    On libère d'abord les fils avant de libérer le noeud...
    ...ou alors on stocke les adresses des fils dans des variables avant de libérer le noeud.
    En général il vaut mieux mettre le NULL juste après le free pour ne pas se tromper (et rechercher des leaks après).

    Ca ressemble à un traitement infixe dans un arbre, mais en mode "libération mémoire", ce qui n'est pas exactement la bonne façon de faire....

    Bref, sinon : algorithmiquement, oui tu aurais pu te passer du tmpTree....
    Mais comme tree est un node**, à chaque fois que tu dirais (*tree)->left il y aurait 2 déréférencement au lieu d'un !
    Donc ça serait un peu plus lent à l'exécution en pratique...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

Discussions similaires

  1. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 23/04/2008, 23h24
  2. suppression d'un arbre binaire
    Par NomUtilisateurDejaPris dans le forum C
    Réponses: 11
    Dernier message: 16/02/2004, 10h05
  3. [Arbre binaire de Recherche]
    Par Giovanny Temgoua dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 06/02/2004, 11h45
  4. Arbre binaire
    Par Heaven dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2004, 19h01
  5. [LG]probleme de creation arbre binaire
    Par jsaviola dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2004, 20h57

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