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

Langage C++ Discussion :

Problème de libération de pointeurs


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut Problème de libération de pointeurs
    Bonjour,

    J'ai un petit soucis pour libérer des pointeurs de classe ayant les dépendances suivantes :

    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
     
    //CLASSE A
    //le .h
    class ClasseA {
    	private :
    		ClasseB * classeB;
    		ClasseC * classeC;
    		ClasseD * classeD;
    	public :
    		void allouerPointeurs():
    		void libererPointeurs();
    		ClasseD * getClasseD();
    }
     
    //le .c
     
    void ClasseA::allouerPointeurs()
    {
    	classeB = new classeB(getClasseD());
    	classeC = new classeC(getClasseD());
    }
     
    ClasseD * ClasseA::getClasseD()
    {
    	if(classeD == NULL)
    		classeD = new ClasseD();
    	return classeD;
    }
     
    void ClasseA::libererPointeurs()
    {
    	if(classeB != NULL)
    		delete classeB;
    	if(classeC != NULL)
    		delete classeC;
    	if(classeD != NULL)
    		delete classeD;	
     }
    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
     
    //CLASSE B
    //le .h
    class ClasseB {
    	private :
    		ClasseD * classeD;
    	public :
    			ClasseB(ClasseD * classeD);
    			~ClasseB();
    }
    //le .c
    ClasseB::ClasseB(ClasseD * classeD)
    {
         this.classeD = classeD;
    }
    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
     
    //CLASSE C
    //le .h
    class ClasseC {
    	private :
    		ClasseD * classeD;
    	public :
    			ClasseC(ClasseD * classeD);
    			~ClasseC();
    }
     
    //le .c
    ClasseC::ClasseC(ClasseD * classeD)
    {
         this.classeD = classeD;
    }
    Quand dans le main j'effectue les appels suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Un main :
     
    int main()
    {
    	ClasseA classeA;
    	classeA.allouerPointeurs();
    	classeA.libererPointeurs();
    }
    J'obtiens une erreur au moment de l'instruction dans ma méthode de libération de ressource.
    Je pense que le problème vient de ma transmission du pointeur ClasseD * classeD; de la classe A vers les classes B et C. mais je ne vois pas comment y remédier sans repenser totalement les dépendances entre mes classes. J'ai essayé en inversant les instruction de delete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void ClasseA::libererPointeurs()
    {
            if(classeD != NULL)
    		delete classeD;
    	if(classeB != NULL)
    		delete classeB;
    	if(classeC != NULL)
    		delete classeC;	
     }
    Mais c'est pareil : bug sur la delete de la classe B. Voici le message erreur généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *** glibc detected *** /home/projet: free(): invalid pointer: 0x028d

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Dans le code ci-dessus, le pointeur classeD n'est jamais initialisé.

    C'est le seul problème que je vois, à moins qu'il y est aussi un problème dans les constructeurs ou destructeurs de ClasseB et ClasseC.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Que fait tu dans les destructeur des classe B et C ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut
    C'est dans la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClasseD * getClasseD();
    que j'initialise mon pointeur s'il est NULL


    Les constructeurs et destructeurs que je n'ai pas écrit sont vides.

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par K-you Voir le message
    Les constructeurs et destructeurs que je n'ai pas écrit sont vides.
    Très très mauvaise idée...

    Tu fais comment en cas d'exception ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut
    Je ne les ai pas écris dans mon exemple, mais dans mon code si.

    D'ailleurs le destructeur vide de ma classeB ne devrait peut être pas être vide. Aparament l'erreur pourrait venir de là (d'après gdb). Pourtant dans B et C je n'ai qu'une copie de l'adresse de ma variable D, donc lorsque je désalloue ma variable D une seule fois dans ma classe anglobante ClasseA, ça devrait suffir pour libérer la mémoire prise par l'objet, non ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    le problème c'est que quand tu déclare ClasseD * classeD il n'est pas certain que classeD == NULL .

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut
    Même en écrivant le constructeur de A comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ClasseA()
    {
         classeB = NULL;
         classeC = NULL;
         classeD = NULL;
    }
    ça ne change rien...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Je viens de voir
    Citation Envoyé par K-you Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     this.classeD = classeD;
    c'est this->classeD. je sais pas si sa viens de la mais bon..

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut
    Ah là je ne suis pas d'accord, this n'est pas un pointeur donc on ne doit pas utiliser le symbole "->". Le fait que classeD soit un pointeur ne change rien.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut
    Ah non tu as raison. J'ai confondu avec Java. Mais de toute façon dans mon cas ce n'était pas ça. J'avais deux noms différents pour l'attribut et pour le paramètre (dans mon propre code).

  12. #12
    Invité
    Invité(e)
    Par défaut
    Tu appelles peut-être deux fois desallouerPointeur ? Dans ce cas il faut remettre tes pointeur a NULL après chaque delete.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Points : 48
    Points
    48
    Par défaut
    Ok ! Non ce n'était pas ça, mais j'ai un peu honte de dire ce que c'était....


    Je faisais un delete sur l'objet de ma classeA (dont je stockais le pointeur) avant d'appeler la méthode de désallocation des attributs de classeA...

    Merci de votre aide en tout cas

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/03/2010, 22h50
  2. Problèmes de libération de Dll en delphi7 sous windows XP
    Par Tardiff Jean-François dans le forum Langage
    Réponses: 5
    Dernier message: 10/01/2006, 15h30
  3. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  4. Libération de pointeurs dans un std::vector
    Par G dans le forum SL & STL
    Réponses: 17
    Dernier message: 06/04/2005, 22h37
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

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