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 :

Arbre binaire et libération récursive de la mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut Arbre binaire et libération récursive de la mémoire
    Bonjour,

    J'ai un doute sur ce que fait exactement un bout de code que j'ai écrit pour l'école, en fait je crains que toute la mémoire allouée pour mon arbre binaire ne soit pas complètement libérée :

    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
    class Dictionnaire
    {
    private:
        char *mot;
        Dictionnaire *gauche;
        Dictionnaire *droite;
     
        void effacer();
     
    public:
        ~Destructeur();
    /* et d'autres choses ici bien entendu */
    }
     
    void Dictionnaire::effacer()
    {
        delete[] mot;
        if (gauche) gauche->effacer();
        if (droite) droite->effacer();
    }
     
    Dictionnaire::~Dictionnaire()
    {
        effacer();
    }
    Est-ce que de cette manière, la mémoire allouée est bien complètement libérée lors de l'appel du destructeur?
    J'ai un doute en fait, j'ai peur que seule la mémoire allouée pour mot[] soit libérée, et peut-être pas la mémoire de tous les *gauche et *droite.

    J'aurais pu directement faire un destructeur récursif, mais j'ai également une fonction reinitialiser() qui doit aussi libérer la mémoire (et donc faire appel à effacer()).

    Autre question, n'y a-t-il pas de problème avec le C++ et la récursivité si la récursion va trop loin? Je pense qu'au niveau performance il vaut mieux concevoir un algorithme itératif (je pense que fonction récursive = un CALL à chaque appel, mais peut-être que le compilateur arrive à éviter ça), et je crois avoir déjà entendu parler d'histoires de "dépassement de pile" si ça va trop profondément.

    Merci!

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ça efface bien tout.
    Par contre, si tu appelles effacer deux fois de suite, comportement indéfini.
    Fais mot = 0 après delete[] mot.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 7
    Par défaut
    OK ça me rassure alors :-)

    Vu que effacer est en private, à moins que je fasse une erreur d'implémentation, je ne pense pas qu'il y ait un risque de double delete (mais je vais quand même rajouter le =NULL, c'est vrai que c'est une bonne habitude à prendre).

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Une façon de te rassurer ne serait-elle pas d'utiliser std::string à la place de char* (si mot désigne bien une chaîne de caractère) ? Tu n'a alors plus à te soucier des allocations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Dictionnaire
    {
    private:
        std::string mot;

  5. #5
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Ça efface bien tout.
    Attention tout de même aux fils gauche et droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dictionnaire *gauche;
        Dictionnaire *droite;
    Je ne sais pas comment tu gères leur mémoire, mais si ils sont censés appartenir au parent Dictionnaire, il faut les libérer.
    Citation Envoyé par pokraka Voir le message
    Vu que effacer est en private, à moins que je fasse une erreur d'implémentation, je ne pense pas qu'il y ait un risque de double delete
    Oui mais tu as parlé d'une fonction reinitialiser() qui est susceptible de l'appeler ; de plus tu appelles directement effacer() sur tes fils (gauche et droite) ce que leur propre destructeur fera aussi (ça fait déjà deux appels ), sauf si tu l'a omis comme je l'ai déjà évoqué plus haut (ce qui produit une fuit mémoire).
    Citation Envoyé par 3DArchi Voir le message
    Bonjour,
    Une façon de te rassurer ne serait-elle pas d'utiliser std::string à la place de char*
    +1

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Franchement, je serais plutôt du genre à faire ceci:
    Code C++ : 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
    class Dictionnaire
    {
    private:
    	std::string mot;
    	Dictionnaire *gauche;
    	Dictionnaire *droite;
     
    	void effacer();
     
    public:
    	~Destructeur();
    	/* et d'autres choses ici bien entendu */
    }
     
    void Dictionnaire::effacer()
    {
    	delete gauche; //if inutile ici, car delete NULL est garanti ne rien faire
    	delete droite; 
    	gauche=NULL;
    	droite=NULL;
    }
     
    Dictionnaire::~Dictionnaire()
    {
    	effacer();
    }
    Ne pas oublier, les pointeurs gauche et droite doivent absolument être initialisés (à NULL ou à une valeur valide) par le constructeur de l'objet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Commande récursive pour dessiner un arbre binaire.
    Par IKota dans le forum Programmation (La)TeX avancée
    Réponses: 2
    Dernier message: 30/05/2010, 22h41
  2. Allocation de mémoire, arbre binaire
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 13/05/2009, 18h19
  3. Afficher un arbre binaire avec sa structure
    Par PhoneKilleR dans le forum C
    Réponses: 7
    Dernier message: 23/04/2008, 23h24
  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