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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    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 : 419
    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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    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 émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    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 : 419
    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 émérite
    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
    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 émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    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 : 419
    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 Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

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

+ 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