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

Vue hybride

zenetcalme c++ constructeur et exception 25/11/2011, 08h18
JolyLoic Il faudrait voir le programme... 25/11/2011, 08h35
zenetcalme Alors j'ai continué mes... 25/11/2011, 09h00
JolyLoic Ah, dans ce cas, c'est... 25/11/2011, 09h02
zenetcalme ok, merci. J'avais... 25/11/2011, 09h07
Klaim Juste pour clarifier : ... 25/11/2011, 14h37
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    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 : 50
    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
    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 confirmé
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    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 : 50
    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
    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 confirmé
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    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
    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 confirmé
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    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...

+ 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