2017-10-09 17 views
0

Je souhaite créer une classe Singleton simple en C++ qui contient des pointeurs vers d'autres types.Supprimer des objets d'une classe singleton

Le singleton deviendra le propriétaire de ce pointeur à un moment donné.

Donc, c'est un bon moyen de supprimer l'objet de type Test et de libérer sa mémoire sur Singleton destructor ?.

class Test{...}; 
class Singleton 
{ 
    public: 
    static Singleton& getInstance() 
    { 
     static std::unique_ptr<Singleton> instance(new Singleton()); 
     return *instance.get(); 
    } 

    void SetTest(Test* test); 
    Test* GetTest() const; 
    ... 
    private: 
     Singleton(){} 
     ~Singleton(){ if(test) delete test;} // ?? 
     Test* test; 
    ... 
}; 

PS: je ne peux pas utiliser de pointeurs intelligents pour l'objet de test.

+0

Je suppose que vous vouliez dire "pointeur vers des objets d'un autre type", afaik il n'y a pas de pointeur vers un type – user463035818

+1

Vous devriez probablement initialiser 'test' dans le constructeur. Sinon, si l'utilisateur n'appelle jamais SetTest, alors GetTest retournera un pointeur invalide (et probablement non nul), et le destructeur essaiera de supprimer quelque chose qui n'a pas été alloué. –

+3

Strictement parlant, un singleton est anti-pattern. Et tout ce dont vous avez besoin est probablement indicatif d'une plus grande anti-modèles dans votre code. – StoryTeller

Répondre

1

Pour donner cette question une conclusion: Oui, il est généralement bon de supprimer l'objet comme vous le proposez. Cependant, s'il vous plaît l'esprit les mises en garde suivantes, qui ont déjà été évoqués dans les commentaires:

  • Assurez-vous d'initialiser test-nullptr dans le constructeur du singleton. Sinon, vous pourriez finir par essayer de supprimer une adresse mémoire aléatoire. (Certains programmeur mec)
  • Vous n'avez pas besoin de vérifier nullptr dans le destructeur. La suppression d'un nullptr est généralement sûre et ne fera rien. (Massimiliano Janes et here)
  • Il est probablement possible d'utiliser un pointeur intelligent dans votre cas, ce qui serait préférable. (Quelque programmeur mec, Massimiliano Janes)