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

Boost C++ Discussion :

shared_ptr et mySQL


Sujet :

Boost C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut shared_ptr et mySQL
    Bonjour,

    Je viens de me mettre à Boost et aux pointeurs intelligents.
    Pour bien comprendre le principe, je le mets en application sur une fonction utilisant mySQL.

    Le code d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include "/opt/mysql/server-5.5/include/mysql.h"
     
    using namespace std;
     
    main()
    {
    	MYSQL* ptrSQL = mysql_init(NULL); 
     
           // Ici du code.
     
           mysql_close(ptrSQL);
            return 0;
    }
    le code avec shared_ptr :
    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
    #include <iostream>
    #include "/opt/mysql/server-5.5/include/mysql.h"
    #include "/usr/include/boost/shared_ptr.hpp"
     
    using namespace std;
    using namespace boost;
     
    main()
    {
    	shared_ptr<MYSQL> ptrSQL;
    	ptrSQL.reset(mysql_init(NULL)); 
     
            // Ici du code.
     
            ptrSQL.reset();
    }
    Quelques questions pour parfaire la compréhension :
    • Est-ce judicieux d'utiliser un shared_ptr dans ce cadre là ? Et si non, pourquoi ?
    • Est-ce que le .reset() remplace mieux, moins bien, ou pareil le mysql_close() ? (Dans les deux cas le,pointeur redevient NULL.)
    • J'aurais eu tendance à laisser le pointeur se supprimer tout seul, est-ce une meilleure solution ?
    • Voyez-vous des erreurs ? L'auriez-vous écrit différemment ?

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Est-ce judicieux d'utiliser un shared_ptr dans ce cadre là ? Et si non, pourquoi ?
    Dans ce cas, c'est effectivement plus intéressant d'utiliser un shared_ptr, quoique, en fonction de ce que tu fais avec ce shared_ptr, un unique_ptr pourrait être suffisant.

    Est-ce que le .reset() remplace mieux, moins bien, ou pareil le mysql_close() ? (Dans les deux cas le,pointeur redevient NULL.)
    Tu enlèves tout l’intérêt en appelant reset à la fin. Ça ne sert à rien, de plus si à un moment ou un autre ton code génère une exception, reset ne sera pas appelé. Utiliser reset revient à utiliser delete et tu ne profites pas du RAII.

    J'aurais eu tendance à laisser le pointeur se supprimer tout seul, est-ce une meilleure solution ?
    Oui c'est le but.

    Voyez-vous des erreurs ? L'auriez-vous écrit différemment ?
    Peut-être avec un unique_ptr si le pointeur ne quitte pas la fonction. Sinon j'encapsulerais le tout dans une classe

    Et j'aurais écrit (au lieu d'utiliser reset) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shared_ptr<MYSQL> ptrSQL(mysql_init(NULL));

  3. #3
    Invité
    Invité(e)
    Par défaut
    Il faut juste ne pas oublier de passer un deleter personnalisé à unique_ptr/shared_ptr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct CloseSql
    {
       void operator()(MYSQL* sql) { sql_close(sql) }
    };
    //...
    boost::unique_ptr<MYSQL, CloseSql> sqlPtr( ... );

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonsoir,

    Attention au RAII quand les étapes de destruction peuvent lancer quand même. (C'est peut-être le cas avec des objet traitant d'une BBD)

    Il est recommander de laisser à disposition des utilisateurs une fonction de terminaison et de les encourager à s'en servir si il veulent vraiment contrôler les exceptions proprement.

    Le destructeur pourra appeler cette fonction avec un swallow-exception au cas où.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Merci, pour vos réponses très instructives.

Discussions similaires

  1. [Kylix] Kylix attaque Mysql ?
    Par nahmsath dans le forum EDI
    Réponses: 9
    Dernier message: 12/08/2002, 19h37
  2. [Kylix] [cgi] pb déploiement appli avec connexion MySQL [rés
    Par Nepomiachty Olivier dans le forum EDI
    Réponses: 3
    Dernier message: 06/08/2002, 20h09
  3. Probleme C++Builder et Mysql
    Par noname dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 13h40
  4. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18
  5. [Kylix] Pb connection à Mysql
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 25/04/2002, 15h26

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