Im Jahr 2008 habe ich eine C++98-Implementierung des Singleton-Entwurfsmusters bereitgestellt, die faul ausgewertet wird, eine garantierte Zerstörung aufweist und technisch gesehen nicht thread-sicher ist:
Kann mir jemand ein Beispiel für Singleton in C++ geben?
Hier ist eine aktualisierte C++11-Implementierung des Singleton-Entwurfsmusters, die faul ausgewertet wird, korrekt zerstört wird und thread-safe .
class S
{
public:
static S& getInstance()
{
static S instance; // Guaranteed to be destroyed.
// Instantiated on first use.
return instance;
}
private:
S() {} // Constructor? (the {} brackets) are needed here.
// C++ 03
// ========
// Don't forget to declare these two. You want to make sure they
// are inaccessible(especially from outside), otherwise, you may accidentally get copies of
// your singleton appearing.
S(S const&); // Don't Implement
void operator=(S const&); // Don't implement
// C++ 11
// =======
// We can use the better technique of deleting the methods
// we don't want.
public:
S(S const&) = delete;
void operator=(S const&) = delete;
// Note: Scott Meyers mentions in his Effective Modern
// C++ book, that deleted functions should generally
// be public as it results in better error messages
// due to the compilers behavior to check accessibility
// before deleted status
};
Siehe diesen Artikel darüber, wann man ein Singleton verwenden sollte: (nicht oft)
Singleton: Wie sollte es verwendet werden?
Siehe diese beiden Artikel über die Reihenfolge der Initialisierung und wie man damit umgeht:
Reihenfolge der Initialisierung statischer Variablen
Probleme mit der statischen Initialisierungsreihenfolge in C++ finden
Siehe diesen Artikel, der die Lebenszeiten beschreibt:
Was ist die Lebensdauer einer statischen Variablen in einer C++-Funktion?
Siehe diesen Artikel, der einige Auswirkungen des Threading auf Singletons diskutiert:
Ist eine Singleton-Instanz, die als statische Variable der GetInstance-Methode deklariert wird, thread-sicher?
Siehe diesen Artikel, der erklärt, warum doppelt geprüftes Sperren in C++ nicht funktioniert:
Was sind die häufigsten nicht definierten Verhaltensweisen, die ein C++-Programmierer kennen sollte?
Dr. Dobbs: C++ und die Gefahren von Double-Checked Locking: Teil I