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 :

Destructeur virtuel et cascade


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Destructeur virtuel et cascade
    Bonsoir,

    Question à 10.000 $ :

    - Soit une classe A avec un destructeur virtuel
    - Soit une classe B dérivée de A avec un destructeur virtuel

    Si je fais : (avec Visual Studio Express 2005)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A* pA = new B();
    delete pA;
    1/ C'est bien le destructeur de B qui est appellé ?

    2/ Le destructeur de A est bien appelé automatiquement aussi (destruction en cascade) ?

    C'est tout bete, mais je m'arrache les cheveux sur une fuite de mémoire, alors je voudrais au moins etre sûr ça.

    Merci !

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Oui, les deux destructeurs sont appelés.

    Cela dit, tu aurais pu trouver toi même en ajoutant par exemple un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class A  {
     
     public:
       virtual ~A() {
         std::cerr<<"Destruction A"<<std::endl;
      }
    };
    Tu aurais vu que les deux destructeurs étaient appelés

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Exact, j'aurais pu trouver moi-meme en faisant ce petit test....

    Sauf que justement mon destructeur n'est pas appelé !!!

    Je voulais juste etre sûr que je ce n'est pas la virtualité qui est en cause.

    Merci pour la confirmation rapide, je vais pouvoir traquer ma fuite de mémoire

    (l'étau se resserre)

    PS : j'ai fait une recherchesur le forum, et j'ai trouvé aucun post simple et concis precisant cela, j'en ai aussi profité pour en créer un.

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    En tout cas, il faut toujours utiliser des destructeurs virtuels, tu aurais pu avoir des soucis sinon.

    Par exemple ici :
    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
    39
    40
    41
     
    /*code pas bon*/
    #include <iostream>
     
     
    class A {
     public:
       ~A() {
           std::cerr<<"Destruction A"<<std::endl;
       }
    };
     
    class B : public A {
       public:
     
      ~B() {
           std::cerr<<"Destruction B"<<std::endl;
       }
     
    };
     
    /*passage pas par référence en plus :*/
    void fonction(A a) {
     
    /*appel du destructeur A*/
    }
     
    int main() {
     std::cerr<<"Test 1"<<std::endl;
     B b;
     fonction(b);
     
     std::cerr<<"Test 2"<<std::endl;
     A * a = new B();
     delete a; /*appel destructeur A et pas B*/
     
     std::cerr<<"Fin test"<<std::endl;
     
     /*appel des destructeurs B et A !*/
     return 0;
    }

  5. #5
    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
    Sauf que justement mon destructeur n'est pas appelé !!!
    C'est parce que tu ne suis pas le RAII.

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Non, la raison était une destruction recursive d'arbre un peu foireuse...

    Mais c'est reglé !

    Merci pour tout

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

Discussions similaires

  1. héritage et destructeurs virtuels.
    Par deubelte dans le forum C++
    Réponses: 19
    Dernier message: 08/04/2010, 10h42
  2. "Pure virtual function called" et destructeur virtuel
    Par Seb des Monts dans le forum C++
    Réponses: 9
    Dernier message: 10/09/2009, 16h54
  3. [POO] Destructeur virtuel pur
    Par Nesto dans le forum C++
    Réponses: 3
    Dernier message: 08/11/2008, 17h18
  4. Precision sur les destructeurs virtuels
    Par Linu6 dans le forum C++
    Réponses: 15
    Dernier message: 01/07/2008, 00h46
  5. probleme sur destructeur virtuel
    Par exhortae dans le forum C++
    Réponses: 5
    Dernier message: 01/03/2008, 07h32

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