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 397
    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 397
    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