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

Langage C++ Discussion :

Desctructeur virtuel et default c++0x


Sujet :

Langage C++

  1. #1
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut Desctructeur virtuel et default c++0x
    Bonjour,
    désolé de vous innodé de question aujourd'hui, mais j'aimerai savoir si le comportement suivant est "normal" :

    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
     
    #include <iostream>
     
    struct A {
      virtual ~A() = default;
    };
     
    struct B : A {
      virtual ~B() {
        std::cout << "B destructor" << std::endl;
      }
    };
     
    int main() {
      B* b = new B;
      A & refA = *b;
      delete &refA;
      return 0;
    }
    donne :
    ????

    alors que
    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
     
    #include <iostream>
     
    struct A {
      virtual ~A() {}
    };
     
    struct B : A {
      virtual ~B() {
        std::cout << "B destructor" << std::endl;
      }
    };
     
    int main() {
      B* b = new B;
      A & refA = *b;
      delete &refA;
      return 0;
    }
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ./leakTest
    B destructor
    Est-ce un bug, ou =default est sensé supprimé la virtualité ? Merci d'avance !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Je dois avouer que je n'ai pas la moindre idée de l'erreur (même si ton "=defaut") doit probablement "dévirtualiser" ton destrcuteur, mais j'aimerais bien savoir ou on peut avoir la doc pour ce genre de conventions ( je n'ai jamais vu cette syntaxe "=default")... (à moins que ce soit un équivalent du "=0")


    Merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    C'est dans le titre, c'est du c++0x >< !
    Voilà le lien du draft n3000.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Lavock Voir le message
    C'est dans le titre, c'est du c++0x >< !
    Voilà le lien du draft n3000.
    J'avais compris. j'espérais simplement qu'il existait quelque-chose de plus "lisible" que les draft papers...
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Il y a toujours wikipedia.

    [edit] J'ai trouvé ça aussi dans la signature de Alp !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  6. #6
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    merci.

    Je sais pas si un destructeur "default" est forcément trivial, mais si c'est le cas, il ne peut être virtuel :http://en.wikipedia.org/wiki/C%2B%2B...plain_old_data
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  7. #7
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Justement, je trouve rien qui va dans se sens. Il y a même une classe dans la norme ou il y a écris texto virtual ~class() = default (nested exception je crois).
    De plus, pour les POD, c'est dit que le destructeur doit être celui par défaut ET non virtuel. Pourquoi cette indication si on ne peut pas le faire ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  8. #8
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    en suite, ça arrive souvent que les compilos ne suivent pas exactement la norme (y'avait un sujet sur la résolution de portée des sous classes y'a pas longtemps d'ailleurs et gcc aussi bien que visual ne suivaient pas la norme)...


    Qu'utilise-tu pour compiler ?

    (je suis désolé de m'en tenir aux généralités, mais étant donné que je suis loin d're ne serais-ce que conaisseur sur le sujet, je ne peut inférer.)
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  9. #9
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Gcc 4.4.0 Mingw port. Je vais vérif ce que ça donne sous Gcc 4.4.1.

    [edit] Après vérification, j'ai le même comportement sous GCC 4.4.1 >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  10. #10
    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
    Par défaut
    Bonjour,
    De ce que je comprend, il faut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct A {
      virtual ~A();
    };
    A::~A()=default;
    Si je comprend bien la norme, si la première déclaration (du destructueur) rencontrée mentionne =default alors c'est la version implicite qui est générée (inline et non virtuelle). En revanche, s'il ne s'agit pas de la première fois, alors cela devient une définition et non plus une déclaration, ce qui veut dire que le virtuel est confirmé.
    Si c'est bien comme ça qu'il faut comprendre, alors on pourrait attendre un avertissement de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct A {
      virtual ~A()=default;
    };

  11. #11
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Effectivement, la déclaration à l'extérieur marche très bien. Pourtant, il serait plus commode de pouvoir écrire comme je le faisait...

    Merci pour ça, tu viens de me résoudre plusieurs giga de leak >< !

    [edit] Au paragraphe 18.8.6, dans la définition de nested_excpetion, on trouve bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    namespace std {
      class nested_exception {
      public:
         nested_exception() throw();
         nested_exception(const nested_exception&) throw() = default;
         nested_exception& operator=(const nested_exception&) throw() = default;
         virtual ~nested_exception() = default;
         // access functions
         void rethrow_nested() const; // [[noreturn]]
         exception_ptr nested_ptr() const;
      };
      template<class T> void throw_with_nested [[noreturn]] (T&& t);
      template <class E> void rethrow_if_nested(const E& e);
    }
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  12. #12
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Dans le même document que tu donnes, on trouve quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct type
    {
        type() = default; // trivial
        virtual ~type() = default; // non-trivial because virtual
        type & operator =( const type & ); // non-trivial
        // because not defaulted here
    };
    inline type & type::operator =( const type & ) = default;
    [edit] Malin la suppression... Référence :
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  13. #13
    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
    Par défaut
    En relisant, j'oscille quand même entre penser qu'il s'agit d'un problème de gcc à la base. =defaultest une définition et ne devrait pas empêcher la première écriture que tu avais. Faut creuser encore un peu.

  14. #14
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    C'est quand même très curieux.

    Il me semblait que le but principal de la syntaxe en =default était de permettre de remplacer la définition de tous ces constructeurs et destructeurs virtuelles vides que nous impose le langage, parfois, par une syntaxe dont la sémantique est un peu plus claire ("laissons-le compilateur générer ce qu'il faut...")

    Mais si =default oblige à faire une déclaration interne puis une définition externe pour avoir le comportement voulu, alors le remède est largement pire que le mal...

    Il faudrait peut-être poster sur comp.std.c++ pour en avoir le cœur net.

  15. #15
    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
    Par défaut
    Salut,
    Citation Envoyé par Arzar Voir le message
    Il faudrait peut-être poster sur comp.std.c++ pour en avoir le cœur net.
    J'ai posé la question. Je reviendrais avec la réponse

  16. #16
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut Réponse de Scott Meyers
    Citation Envoyé par SCOTT MEYERS
    I read N3000 the same way you do. I think you've found a bug in gcc's
    implementation. I suggest you file a bug report.
    Je sais pas si c'est l'auteur d'effective C++ ou si c'est un homonyme, mais je vais remplir un rapport de bug... Sait-on jamais.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  17. #17
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Je sais pas si c'est l'auteur d'effective C++ ou si c'est un homonyme [...].
    C'est pas un homonyme.
    Il poste souvent sur comp.std.c++

  18. #18
    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
    Par défaut
    Citation Envoyé par Lavock Voir le message
    je vais remplir un rapport de bug...
    J'imagine qu'il s'agit de celui-là n°42983

  19. #19
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'imagine qu'il s'agit de celui-là n°42983
    Oui >< ! Pourquoi, j'ai fais quelque chose de mal ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  20. #20
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Lavock Voir le message
    Oui >< ! Pourquoi, j'ai fais quelque chose de mal ?
    Absolument pas, au contraire

    Je présumes que 3D voulait simplement savoir s'il s'agissait du même lavock
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 25
    Dernier message: 04/12/2004, 12h06
  2. mémoire virtuelle minimale insuffisante
    Par sempire dans le forum Windows XP
    Réponses: 16
    Dernier message: 15/10/2003, 17h29
  3. [Turbo Pascal] Limite de la mémoire virtuelle
    Par moon tiger dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 08/02/2003, 22h30
  4. Existe-t-il un langage de prog "virtuel" en Français
    Par HRS dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/06/2002, 18h11
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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