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 :

c++ constructeur et exception


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut c++ constructeur et exception
    Bonjour,

    J'ai un petit doute.
    dans la FAQ c++ : http://cpp.developpez.com/faq/cpp/?p...S_constructeur

    Il est écrit à la fin du topic que le destructeur n'est pas appelé si on a une exception dans le constructeur.

    J'utilise Borland C++ builder 2009, et j'ai l'impression que mon destructeur est appelé quand même.
    mon constructeur ressemble a çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MaClass::MaClass
    {
         try
         {
              ....
         }
         catch( MonExecption &Erreur)
         {
               Netoyage
               affichage de la valeur de this dans un msg de débug
               throw
         }
    }
    et mon destructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaClass::~MaClass
    {
        Netoyage
        affichage de la valeur de this dans un msg de débug
    }
    ben la, j'arrive a avoir une exception ET un destructeur avec la même valeur de this...
    Est ce que j'aurais mal compris quelque chose?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il faudrait voir le programme complet pour en être certain, mais effectivement, tu ne devrais pas avoir d'appel du destructeur dans ce cas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Alors j'ai continué mes analyses.
    La classe MaClass hérite en fait d'une autre classe.

    Et c'est le destructeur de celle ci (la classe mère) qui est appelé!

    à première vue, c'est pas complétement incohérent.
    suis je sur la bonne voie?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Ah, dans ce cas, c'est normal. Tout ce qui a fini d'être construit a son destructeur appelé. Les données membre, la classe de base. Seule la classe elle même, pas complètement construite, n'a pas de destructeur appelé.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    ok, merci.

    J'avais commencé a m'en douter...
    Par contre, est ce qu'une précision ou un "warning" pourrait être ajouter à la FAQ?

  6. #6
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Ah, dans ce cas, c'est normal. Tout ce qui a fini d'être construit a son destructeur appelé. Les données membre, la classe de base. Seule la classe elle même, pas complètement construite, n'a pas de destructeur appelé.
    Juste pour clarifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
       A a;
       B b;
       C c;
    }
    Si dans le constructeur de A on lance une exception, ni a ni b ni c n'auront leurs destructeurs d'appelés. A n'est pas construit tant qu'il ne finis pas d'executer son constructeur donc le lancement de l'exception interrompt la construction et a n'est pas considéré comme construit. Les autres n'ont même pas commencé a être construits donc forcément ils ne sont pas détruits.

    Si dans le constructeur de B on lance une exception, a, qui a été construit, sera détruit donc son destructeur sera appelé. b et c n'ayant pas été construits (b n'a pas fini sa construction), leurs destructeurs ne seront pas appelés.

    Si dans le constructeur de C on lance une exception, seul c n'est pas encore construit, donc seul c n'aura pas son destructeur appelé, tandis que a et b auront bien leurs destructeurs appelés.

  7. #7
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Oui c'est bien ce qu'on a dit.
    mais je parle du problème d'héritage, qui est a mon avis pas assez explicité dans la FAQ.
    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
    Class A
    {
         A()
         {
              code
         }
    }
     
    Class B: public A
    {
         B():A()
         {
              code 
              exception
         }
    }
    dans ce cas la, le destructeur de B n'est pas appelé. mais celui de A si!
    C'est bien ce cas que je ne trouve pas assez explicit, ni dans la FAQ...

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est exactement la même logique que dans mon exemple. Simplement, remplace le code par C qui hérite de B qui hérite de A et le reste de mon descriptif marche.

  9. #9
    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
    Points : 13 017
    Points
    13 017

  10. #10
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    en fait, j'ai du mal m'exprimer.
    on vas dire que j'avais mal compris le principe de l’héritage.

    Pour moi, quand B hérite de A, A n'as pas de réel résistance en mémoire. il est englobé dans B, et forme un tout.

    Hors, grâce a ce problème, je sais maintenant que A existe en tant que tel, et qui existe bel et bien quelque part dans la mémoire.

    C'est ce point la en fait, que je n'ai pas trouvé clair. mais peut être qu'il est explicité ailleurs dans la FAQ, j'avoue que j'ai pas cherché.

    ps: Je sais que mon explication n'est pas clair, mais c'est juste pour essayer d'illustrer mes propos.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Pour moi, quand B hérite de A, A n'as pas de réel résistance en mémoire. il est englobé dans B, et forme un tout.
    Hors, grâce a ce problème, je sais maintenant que A existe en tant que tel, et qui existe bel et bien quelque part dans la mémoire.
    A ma connaissance, il s'agit bien d'un tout: une partie de la mémoire attribuée à l'instance contient les attributs de sa classe de base (attention, avec l'héritage multiple les attributs d'une même classe de base peuvent je crois figurer plusieurs fois). Cela n'empêche pas que le constructeur de la classe de base soit appelé lors de la construction de l'objet dérivé (ce qui permet d'initialiser la partie de l'objet correspondant à la classe de base, justement).

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

Discussions similaires

  1. erreur dans constructeur sans exception
    Par Madalen dans le forum Langage
    Réponses: 5
    Dernier message: 18/08/2009, 10h07
  2. Réponses: 18
    Dernier message: 28/02/2007, 10h23
  3. gérer les exceptions sur les constructeurs?
    Par LESOLEIL dans le forum Général Java
    Réponses: 9
    Dernier message: 15/03/2006, 10h46
  4. exception dans un constructeur
    Par xxiemeciel dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 18h14
  5. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52

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