web-dev-qa-db-fra.com

Mon singleton peut être appelé plusieurs fois

J'ai mis en place un singleton basé sur C++ 11. Cependant, le constructeur peut être appelé plusieurs fois dans certains cas.

La classe sera compilée à Static Lib et utilisée par d'autres SO Lib (plus d'un SO Lib). Et le système est un système multi-thread (exécuté dans le Android hal Niveau)

/// le fichier .h:

class Logger
{
public:

    /// Return the singleton instance of Logger
    static Logger& GetInstance() {
        static Logger s_loggerSingleton;
        return s_loggerSingleton;
    }

private:

    /// Constructor
    Logger();
    /// Destructor
    ~Logger();
}

/// le fichier .cpp

Logger::Logger()
{
   ALOGE("OfflineLogger create");
}

Logger::~Logger()
{

}

Il devrait être créé une fois par exemple:

03-21 01:52:20.785   728  4522 E         : OfflineLogger create

Cependant, je peux voir qu'il a été créé plus d'une fois

03-21 01:52:20.785   728  4522 E         : OfflineLogger create
03-21 01:52:20.863   728  2274 E         : OfflineLogger create
03-21 01:52:20.977   728  2273 E         : OfflineLogger create
03-21 01:52:26.370   728  4522 E         : OfflineLogger create

Des questions:

  1. Quelque chose de mal avec mon design singleton? Est-ce une question de fil-sécurité?

  2. On dirait que mon singleton fonctionne bien en une fois une seule portée, mais chaque libellée qui inclut mon singleton créera son propre singleton, de sorte que mon singleton n'est plus "sois un singleton". Le problème est-il causé à partir de chaque liaison dynamique à la nouvelle et la "variable statique" devient "statique locale"? C'est possible? Si oui, comment résoudre?

32
hismart

la variable statique doit être déplacée vers un fichier .cpp.

Un moyen simple est de ne conserver que la déclaration de getinstance () dans .h et de déplacer la mise en œuvre au fichier .CPP.

0
AIMIN PAN