Pointeur intelligent et singleton [résolu]

Pointeur intelligent et singleton [résolu] - C++ - Programmation

Marsh Posté le 13-12-2014 à 20:56:21    

Salut, j'essai de transposer ce code en utilisant des pointeur intelligent et je sèche...
 
L'original :

Code :
  1. TextureManager* TextureManager::s_pInstance = NULL; // déclarer en static dans le header
  2. TextureManager* TextureManager::Instance()              // idem
  3. {
  4.     if (s_pInstance == NULL)
  5.     {
  6.         s_pInstance = new TextureManager();
  7.         return s_pInstance;
  8.     }
  9.     return s_pInstance;
  10. }


 
Ma sauce :

Code :
  1. //---------------- TextureManager.h ----------------  
  2. class TextureManager
  3. {
  4. private:
  5.         std::map<std::string, SDL_Texture*>  m_textureMap;
  6.         //static TextureManager*     s_pInstance;  ////
  7.         static std::unique_ptr<TextureManager>  s_pInstance;
  8.         TextureManager();
  9. public:
  10.         //static TextureManager*  Instance();      // singleton
  11.         static std::unique_ptr<TextureManager> Instance();
  12.         ~TextureManager();
  13. };
  14. //---------------- TextureManager.cpp ----------------  
  15. std::unique_ptr<TextureManager> TextureManager::s_pInstance = nullptr; // toujours en static dans le header
  16. std::unique_ptr<TextureManager> TextureManager::Instance()  // idem
  17. {
  18.     if (s_pInstance == nullptr)
  19.     {
  20.         std::unique_ptr<TextureManager> s_pInstance(new TextureManager());
  21.         return s_pInstance;
  22.     }
  23.     return std::move(TextureManager::s_pInstance);
  24. }


 
Le singleton ne fonctionne plus, s_pInstance reçoit une nouveau pointeur a chaque appelle de "Instance()"


Message édité par bqron le 14-12-2014 à 07:17:58
Reply

Marsh Posté le 13-12-2014 à 20:56:21   

Reply

Marsh Posté le 13-12-2014 à 21:07:31    

Bonsoir !
 
Dans la fonction "instance", vous créez une variable locale "s_pInstance", qui masque le membre statique, et c'est à cette variable que vous donnez une valeur, pas au membre, qui vaut donc toujours "nullptr", puisqu'aucune valeur ne lui a été affectée ...
 
Enlevez le "std::unique_ptr<TextureManager>" et faites une affectation (je n'ai plus la syntaxe du std::unique_ptr en tête, je ne sais pas si il faut faire un "=" ou un "set" pour lui affecter une valeur).
 
Bonne continuation !

Reply

Marsh Posté le 14-12-2014 à 07:16:58    

Merci de m'avoir mit sur la bonne voie, le problème est résolu :  

Code :
  1. std::shared_ptr<TextureManager> TextureManager::s_pInstance = nullptr;
  2. std::shared_ptr<TextureManager> TextureManager::Instance()
  3. {
  4.     if (s_pInstance == nullptr)
  5.     {
  6.         s_pInstance = std::make_shared<TextureManager>(TextureManager());
  7.         return s_pInstance;
  8.     }
  9.     return s_pInstance;
  10. }


 
Une question tout de même à propos du code original si possible, j'ai remarqué que le destructeur n’étais jamais appeler du coup le pointeur renvoyé par  "new TextureManager();" n’étais jamais libéré (a mon avis), même si j'utilisais le code ci-dessous, quelqu'un aurait-il une explication ?

Code :
  1. TextureManager::~TextureManager()
  2. {
  3.     if (s_pInstance != NULL)
  4.         delete s_pInstance;
  5. }

Reply

Marsh Posté le 15-12-2014 à 08:03:19    

Dans l'ancienne version, l'attribut "s_pInstance" restait toujours à NULL, vu que c'était une variable locale (qui n'était a priori jamais libérer) qui était allouée, en lieu et place de l'attribut.
 
En revanche, un destructeur public pour une classe singleton, c'est vraiment très étrange, pas du tout dans l'état de l'art (et casse-gueule dans environ 100 % des cas)
 
Bonne continuation !


Message édité par Farian le 15-12-2014 à 08:03:49
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed