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 :

probleme de shared_ptr static


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut probleme de shared_ptr static
    Bonjour,

    Dans une application multi-thread, j'utilise un singleton basé sur un 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    	namespace usb {
     
    		class cUSBManager
    		{
    		  /* ATTRIBUTES */
    		  static boost::shared_ptr<cUSBManager> saSINGLETON_INSTANCE;
     
    		protected:
    		  (... des champs ...)
     
    		  /* METHODS */
    		public:
    		  ~cUSBManager();
     
    		  (... des méthodes ...)
     
    		  static boost::shared_ptr<cUSBManager> mGetInstance();
     
    		private:
    		  // This class is a singleton, use factory to get the instance
    		  cUSBManager();
    		};
    	}
     
     
    /* Statics var and func for singleton management */
    boost::shared_ptr<cUSBManager> usb::cUSBManager::saSINGLETON_INSTANCE = boost::shared_ptr<cUSBManager>();
     
    boost::shared_ptr<cUSBManager> usb::cUSBManager::smGetInstance()
    {
      if(!cUSBManager::saSINGLETON_INSTANCE.get())
        cUSBManager::saSINGLETON_INSTANCE = 
          boost::shared_ptr<cUSBManager>(new cUSBManager());
     
      return cUSBManager::saSINGLETON_INSTANCE;
    }
    Lorsque j'ai testé ce code pour la première fois Visual Studio m'a rapporté une fuite de mémoire. Cependant, il semble s'agir d'un faux positif dû au fait que la détection des fuites de mem. est faite avant la destruction des champs statiques. Je suis d'ailleurs capable de m'arrêter sur un break point dans le destructeur de saSINGLETON_INSTANCE.
    Ce problème est pénible car je ne voudrais pas devoir trier tous les rapports de fuite de mémoire.

    D'où ma question: comment peut on se débarrasser mon output de ces fausses (si elles le sont vraiment) fuites de mémoires ?

    Merci d'avance
    Ju

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Je ne comprends pas pourquoi tu utilises un shared_ptr ici. C'est un singleton, il n'y a pas de responsabilité partagée.
    Pourquoi ne pas renvoyer une référence ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Citation Envoyé par poukill Voir le message
    Je ne comprends pas pourquoi tu utilises un shared_ptr ici. C'est un singleton, il n'y a pas de responsabilité partagée.
    Pourquoi ne pas renvoyer une référence ?
    Oui oui, tu as entièrement raison.
    On devrait plutôt avoir un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cUSBManager* usb::cUSBManager::smGetInstance()
    {
      if(!cUSBManager::saSINGLETON_INSTANCE.get())
        cUSBManager::saSINGLETON_INSTANCE = 
          boost::shared_ptr<cUSBManager>(new cUSBManager());
     
      return cUSBManager::saSINGLETON_INSTANCE.get();
    }
    Mais je veux garder mon instance dans un shared_ptr pour ne pas avoir à faire un appel explicite au destructeur
    Je voudrais aussi que mon singleton crée son instance au premier appel à smGetInstance(), et la garde jusqu'à la fin de l'exécution du code.

    Ju

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Tu en as vraiment besoin ou ça ne te dérange pas d'initialiser le singleton avant le lancement de tes threads? C'est le plus simple.

  5. #5
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    Tu en as vraiment besoin ou ça ne te dérange pas d'initialiser le singleton avant le lancement de tes threads? C'est le plus simple.
    Merci de ton aide...

    En fait, pour une execution donnée, je ne suis pas sur que le singleton sera demandé. Si il est demandé, il le sera un grand nombre de fois.
    La création de mon singleton est couteuse car il initialise récursivement un modèle mémoire de l'arbre des périfériques USB de ma machine. Je voudrais évité ça si ce n'est pas utile.
    Mais au final, après vos commentaires, je me demande si le plus simple ne serait pas de créer mon singleton à l'initialisation du code (sans le conserver dans un shared_ptr), mais de faire l'initialisation uniquement lors du premier appel à smGetInstance().
    Je perd un peu de mémoire si mon singleton n'est jamais utilisé, mais c'est pas plus grave que ça.

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    encore mieux: ne pas utiliser de singleton

  7. #7
    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 Joel F Voir le message
    encore mieux: ne pas utiliser de singleton
    Etes-vous atteint de Singletonite ?

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cUSBManager& usb::cUSBManager::smGetInstance()
    {
      static cUSBManager manager;
      return manager;
    }
    Ca ne règle pas tous les problèmes dus à l'utilisation d'un singleton, mais au moins ça simplifie le code...

    Mais oui bien sûr, un bon singleton est un singleton qui n'existe pas. :p

    MAT.

  9. #9
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    @3DArchi :
    Héhéhé Je viens de lire l'article. Très bon .

    Ca m'a incité à faire un bon refactoring .
    Ciao le singleton au niveau du manager USB. Je l'ai remplacé par une statique qui garde le nœud racine de mon arbre USB et qui est détruite à la mort du dernier manager (par comptage de références). Cela me permet de garder plusieurs instance de mon manager sans dupliquer ses données.

    @Mat : Merci de ton aide.

    Julien

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 19/04/2010, 08h40
  2. Réponses: 3
    Dernier message: 18/04/2007, 14h02
  3. [POO] Probleme avec static et autoload
    Par laetyboop dans le forum Langage
    Réponses: 1
    Dernier message: 23/03/2006, 14h46
  4. [MFC] enorme probleme entre statics et includes
    Par giova_fr dans le forum MFC
    Réponses: 4
    Dernier message: 09/12/2005, 14h15
  5. Problème avec l'option -static de gcc
    Par lsdInside dans le forum Linux
    Réponses: 2
    Dernier message: 08/05/2004, 01h01

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