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 :

pimpl avec auto_ptr


Sujet :

Langage C++

  1. #1
    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 pimpl avec auto_ptr
    Bonjour,
    normalement on peut utiliser auto_ptr pour utiliser l'idiom Pimpl.
    http://www.gotw.ca/publications/usin...ffectively.htm

    Seulement parfois, sur certain projet (pas tous), j'ai ce message d'erreur:

    Warning 1 warning C4150: deletion of pointer to incomplete type 'QExtend::SignalCheckPoint::SignalCheckPointPrivate'; no destructor called C:\Program Files\Microsoft Visual Studio 9.0\VC\include\memory 721
    Pourtant, je fait bien la même chose... Avez vous une idées d'où peut venir ce warning et comment le régler en gardant le "forward declacaration"?

    merci

    [edi]
    la seul différence que je vois, c'est que les warning apparaissent dans la création d'une dll et pas dans la création d'un exe...

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Le problème du pimpl avec auto_ptr, c'est qu'il faut donner un destructeur a la class, dans le cpp(pas inline). Sinon il sera instancié automatiquement, mais sans connaitre le type privé, et donc le destructeur de l'implémentation privée ne peut être appelé. D'ou le warning.

    Il faut penser aussi a implémenter(ou empêcher) le constructeur par copie et l'opérateur de copie.

    Perso je préfère utiliser un shared_ptr pour le pimpl. Ca évite ce genre de probleme, surtout que tout les compilo ne font pas ce warning.

  3. #3
    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
    Ce qui m'étonne c'est que l'info viens de GOTW. Et qu'il semble y avoir une erreur....

    Citation Envoyé par Nogane Voir le message
    Bonjour,
    Le problème du pimpl avec auto_ptr, c'est qu'il faut donner un destructeur a la class, dans le cpp(pas inline).
    j'ai pas compris cette phrase...


    Citation Envoyé par Nogane Voir le message
    Perso je préfère utiliser un shared_ptr pour le pimpl. Ca évite ce genre de probleme, surtout que tout les compilo ne font pas ce warning.
    C'est ce que j'ai lue. shared_ptr as une astuce pour contourner le problème, mais je n'utilise pas boost....

    Du coup, ça veut dire que l'on ne peut faire de "forward declaration" quand on utilise une classe template exploitant cette déclaration (std::vector, std::auto_ptr,...) en membre d'une classe?

  4. #4
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Citation Envoyé par yan Voir le message
    j'ai pas compris cette phrase...
    Il faut déclarer le destructeur de la class, et le définir dans le cpp, tout simplement.
    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
     
    //MaClass.h
     
    #include <memory>
     
    class MaClassPImpl;
    class MaClass
    {
      std::auto_ptr<MaClassPImpl> pimpl_;
     
      MaClass(const MaClass&); //Pas définie pour ne pas avoir a gérer les copies d'auto_ptr
      MaClass& operator = (const MaClass&); //idem
     
    public:
      MaClass();
      ~MaClass(); //Définie dans le CPP
    };
     
     
     
    //MaClass.cpp
     
    #include "MaClass.h"
     
    class MaClassPImpl
    {
    };
     
    MaClass::MaClass():
      pimpl_(new MaClassPImpl())
    {
    }
     
    MaClass::~MaClass()
    {
      //Ici, l'auto_ptr sauras détruire MaClassPImpl.
    }
    Citation Envoyé par yan Voir le message
    Du coup, ça veut dire que l'on ne peut faire de "forward declaration" quand on utilise une classe template exploitant cette déclaration (std::vector, std::auto_ptr,...) en membre d'une classe?
    C'est possible avec l'auto_ptr car il ne contient qu'un pointeur.

  5. #5
    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
    Citation Envoyé par Nogane Voir le message
    Il faut déclarer le destructeur de la class, et le définir dans le cpp, tout simplement.
    ha ok.

    Sinon, Il semble que std::tr1::shared_ptr le permet. Je ne sais pas s'il existe sur gcc.

    C'est con que ce ne soit qu'un warning. C'est potentiellement trés dangereux comme truc.

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

Discussions similaires

  1. constructeur et = (avec auto_ptr)
    Par gb_68 dans le forum C++
    Réponses: 4
    Dernier message: 15/04/2008, 11h47
  2. Probleme de auto_ptr avec les map
    Par Luther dans le forum C++
    Réponses: 8
    Dernier message: 08/04/2005, 10h49
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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