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

Bibliothèques Discussion :

[BOOST] shared_ptr et pointer C


Sujet :

Bibliothèques

  1. #1
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut [BOOST] shared_ptr et pointer C
    Bonjour,

    Voilà je découvre les merveilles des shared_ptr<> de la boost. Problème j'utilise la lib SDL qui est en C dans une application C++. Donc mon programme j'utilise beaucoup de shared_ptr<SDL_Surface> mais quand je dois passer ce pointeur dans un fonction de la SDL il me dit que les types sont pas compatible.

    De plus je me pose une question, comment shared_ptr peut-il savoir que pour faire un delete de la structure il faut faire appelle à SDL_FreeSurface ??

    Bref je suis un peu dans le flou, si vous pouviez m'expliquer comment utiliser proprement ces shared_ptr avec du C ce serait génial.

    Merci !
    This message was powered by:
    Ubuntu GNU/Linux

  2. #2
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    J'ai en partie trouvé, suffi d'utiliser la méthode get() pour avoir un pointeur classique. Mais alors comment ça se passe si je fais un SDL_FreeSurface() sur ce pointeur ? apres le shared_ptr<> il va etre détruit automatiquement ? ou alors il sera invalide et ça risque de générer une exeption au prochain usage ?
    This message was powered by:
    Ubuntu GNU/Linux

  3. #3
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Bon j'avance dans les recherces, je suis presque sur qu'il faut utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class Y, class D> shared_ptr(Y * p, D d);
    J'ai vaguement compris que p sera détruit grace à d... mais je comprends pas comment ça marche et comment concraitement l'utiliser...
    This message was powered by:
    Ubuntu GNU/Linux

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Si tu lui passes l'adresse de la fonction de libération ?
    Cela m'a tout l'air d'attendre un foncteur ou une fonction. La FAQ parle de ces bêtes.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    non la FAQ ne parle pas de ce dont j'ai besoin.

    Y*p à ce que j'ai compris c'est le pointeur qui est traité dans le shared_ptr, pas une foncton.

    D d à ce que j'ai compris c'est un objet donc le constructeur sera appelé avec p en parametre pour le détruire...
    This message was powered by:
    Ubuntu GNU/Linux

  6. #6
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    J'ai essayé ça:
    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
     
    class A
    {
    public:
      A(){str="gfs\n";}
      ~A(){cout << str;}
      string str;
    };
     
    class B
    {
    public:
      B(){cout << "rien" << endl;}
      B(A *&a){cout << "destructions "; delete a;}
    };
     
    int main()
    {
      A *a = new A();
      B b;
      shared_ptr<A> ptr(a, b);
    }
    Mais il fait une erreur de compilation que je comprends pas:
    zdra@gentoo:~$ g++ test.cpp -o test
    /usr/include/boost/detail/shared_count.hpp: In constructor `boost::detail::shared_count::shared_count(P, D) [with P = A*, D = B]':
    /usr/include/boost/shared_ptr.hpp:136: instantiated from `boost::shared_ptr<T>::shared_ptr(Y*, D) [with Y = A, D = B, T = A]'
    test.cpp:26: instantiated from here
    /usr/include/boost/detail/shared_count.hpp:344: erreur: pas de concordance pour l'appel de « (B) (A*&) »
    This message was powered by:
    Ubuntu GNU/Linux

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Si, si. On parle bien des foncteurs dans la FAQ.
    http://c.developpez.com/faq/cpp/?page=STL#STL_functor
    Le constructeur de B sera non spécifié (le constructeur par défaut généré par défaut suffisant ici), mais son opérateur() prendra une référence sur un pointeur vers A.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Oké merci je connaissais absolument pas cette histoire de foncteur. Décidément la FAQ faut la lire completement il n'y a pas une miette à perdre !

    Bref mon code suivant marche nickel:
    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
     
    class A
    {
    public:
      A(){str="gfs\n";}
      ~A(){cout << str;}
      string str;
    };
     
    struct B
    {
      void operator ()(A *&a) const 
       { 
         cout << "destruction ";
          delete a;
       } 
    };
     
    int main()
    {
      B b;
      shared_ptr<A> ptr(new A(), b);
    }
    This message was powered by:
    Ubuntu GNU/Linux

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/03/2008, 21h59
  2. Réponses: 12
    Dernier message: 25/02/2008, 14h27
  3. Copie de boost::shared_ptr
    Par Kurisu dans le forum Boost
    Réponses: 2
    Dernier message: 07/09/2006, 15h29
  4. [BOOST] shared_ptr et void*
    Par bourrik dans le forum Bibliothèques
    Réponses: 16
    Dernier message: 16/06/2006, 17h12
  5. boost::shared_ptr et singletons
    Par Elendil_BzH dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 15/01/2006, 20h45

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