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:
Quelque chose de mal avec mon design singleton? Est-ce une question de fil-sécurité?
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?
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.