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 :

Class imbriqué : problème de delete


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut Class imbriqué : problème de delete
    Bonsoir,

    J'ai une classe sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class B;
    class A{
      protected:
        vector <B *> m_b;
        ...
      public:
        ~virtual A();
    };
     
    class B : public A{
    ...
    };
    Et j'ai un problème pour supprimer les objets A.
    Je parcours le vecteur m_b en faisant un delete à chaque itération, mais j'ai core dump... Je ne comprend pas.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour,
    ce n'est pas plutôt

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Oui effectivement, j'ai tapé ce message rapidement.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Montre comment tu alloue et delete les pointeur dans ton vecteur
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    1) Pourquoi avoir un vector<B*> et pas vector<A *> en utilisant le polymorphisme?

    2) Effectivement, comme l'ont dit mes collègues au dessus, il faudrait un peu plus de code pour détecter ton problème.
    Juste une petite remarque : il existe chez Boost un conteneur spécial pointeur qui te décharge de toute désallocation, c'est automatique...
    -> Tu trouveras de la doc ICI

    Bonne continuation,

    Poukill

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Ouais, vive les ptr_containers!

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Citation Envoyé par poukill Voir le message
    1) Pourquoi avoir un vector<B*> et pas vector<A *> en utilisant le polymorphisme?
    En fait, la classe B représente un sous programme et son vecteur (de sous programme) ses appels de sous programme.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    fonction1(){
      fonction2();
      fonction3();
    }
    fonction2(){
    }
    fonction3(){
    }
    Donc on aura 3 objets B :
    B1 son vecteur contiendra B2 et B3
    B2 vecteur vide
    B3
    L'objet A servira à stocker l'ensemble des sous programme.

    Voici le destructeur de A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     	vector<Sub_program *>::iterator iter_prog;
     	for(iter_prog = m_sub_programs.begin(); iter_prog != m_sub_programs.end(); iter_prog++){
     		if(*iter_prog != NULL)
     			delete (*iter_prog);
     	}
    Celui de B détruit seulement ces données à détruire.

    Edit:
    Pour l'allocation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub_program * sprog = new Sub_program(adress_temp);
    // Ajoute au vecteur de la classe A
    m_program->add_sub_program(sprog);
    Un objet Sous_program contient donc lui aussi des pointeurs vers d'autres objets Sous_program.

    Je suis en train de me renseigner sur boost. Merci pour le lien.

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    TU peux nous montrer le destructeur de B ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Pas de problème.
    Voici les destructeurs complets :
    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
     
    Program::~Program(){	
            vector<Instruction *>::iterator iter_instr;
    	for(iter_instr = m_instructions.begin(); iter_instr != m_instructions.end(); iter_instr++){
    		delete (*iter_instr);
    	}
     
     	vector<Sub_program *>::iterator iter_prog;
     
     	for(iter_prog = m_sub_programs.begin(); iter_prog != m_sub_programs.end(); iter_prog++){
     		if(*iter_prog != NULL)
     			delete (*iter_prog);
     	}
    	cout << "Program deleted" << endl;
    }
    Sub_program::~Sub_program(){
    	cout << "Deleting ssprog : " << hex << m_adr_begin << endl;
    	vector<Instruction *>::iterator iter_instr;
    	for(iter_instr = m_instructions.begin(); iter_instr != m_instructions.end(); iter_instr++){
    		delete (*iter_instr);
    	}
    }
    L'objet A(Program) comporte un vecteur d'instruction et donc B aussi par héritage.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Même si le destructeur est correct, il reste encore THE oubli classique dans ce genre de cas: le constructeur de copie et l'opérateur d'affectation.
    Ils doivent bien entendu copier les données pointées. Si cela n'est pas possible (l'utilisation du polymorphisme oo est une très bonne raison) tu dois rendre ta classe non copiable, ce qui pour rappel se fait avec la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class x {
      ...
      private:
      x(const x&);
      x& operator = (const x&);
    };
    Tu es sur d'avoir géré cet aspect correctement?

  11. #11
    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
    Et si tu implémentes l'opérateur = , une implémentation conseillée est de passer par une fonction d'échange + le constructeur de copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CUneClasse& CUneClasse::operator=(CUneClasse const & src)
    {
    	CUneClasse tmp(src);
    	Swap(tmp);
    }
    La fonction Swap(), elle, prend en paramètre une référence non-constante et peut être très légère, car elle n'a rien à copier.
    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.

Discussions similaires

  1. [Débutant] Visual Studio 2010 (VB) - Problème de classes imbriquées
    Par patrickvier dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/09/2012, 12h15
  2. Problème classe imbriquée
    Par eento dans le forum Android
    Réponses: 8
    Dernier message: 08/08/2012, 02h30
  3. Réponses: 11
    Dernier message: 11/03/2011, 10h36
  4. Problème de DELETE
    Par WinZy dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 12h58
  5. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56

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