Wir haben dieses Thema kürzlich in meiner EECS-Klasse behandelt. Wenn Sie sich die Vorlesungsunterlagen ausführlich ansehen möchten, besuchen Sie http://umich.edu/~eecs381/lecture/IdiomsDesPattsCreational.pdf
Ich kenne zwei Möglichkeiten, um eine Singleton-Klasse korrekt zu erstellen.
Erster Weg:
Implementieren Sie es ähnlich wie in Ihrem Beispiel. Was die Zerstörung betrifft, "halten Singletons normalerweise die Dauer des Programmlaufs aus; die meisten Betriebssysteme stellen Speicher und die meisten anderen Ressourcen wieder her, wenn ein Programm beendet wird. Es gibt also ein Argument, sich darüber keine Sorgen zu machen."
Es wird jedoch empfohlen, bei Programmbeendigung aufzuräumen. Daher können Sie dies mit einer statischen SingletonDestructor-Hilfsklasse tun und dies als Freund in Ihrem Singleton deklarieren.
class Singleton {
public:
static Singleton* get_instance();
// disable copy/move -- this is a Singleton
Singleton(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton& operator=(Singleton&&) = delete;
friend class Singleton_destroyer;
private:
Singleton(); // no one else can create one
~Singleton(); // prevent accidental deletion
static Singleton* ptr;
};
// auxiliary static object for destroying the memory of Singleton
class Singleton_destroyer {
public:
~Singleton_destroyer { delete Singleton::ptr; }
};
Der Singleton_destroyer wird beim Programmstart erstellt. "Wenn das Programm beendet wird, werden alle globalen / statischen Objekte durch den vom Linker eingefügten Code zum Herunterfahren der Laufzeitbibliothek zerstört, sodass der_Destroyer zerstört wird. Sein Destruktor löscht den Singleton und führt seinen aus Zerstörer. "
Zweiter Weg
Dies wird als Meyers Singleton bezeichnet und vom C ++ - Assistenten Scott Meyers erstellt. Definieren Sie get_instance () einfach anders. Jetzt können Sie auch die Zeigerelementvariable entfernen.
// public member function
static Singleton& Singleton::get_instance()
{
static Singleton s;
return s;
}
Dies ist ordentlich, da der zurückgegebene Wert als Referenz dient und Sie die .
Syntax verwenden können, anstatt ->
auf Mitgliedsvariablen zuzugreifen.
"Der Compiler erstellt automatisch Code, der das erste Mal durch die Deklaration und nicht danach erstellt, und löscht dann das statische Objekt beim Beenden des Programms."
Beachten Sie auch, dass Sie mit dem Meyers Singleton "in eine sehr schwierige Situation geraten können, wenn Objekte zum Zeitpunkt der Beendigung aufeinander angewiesen sind - wann verschwindet der Singleton relativ zu anderen Objekten? Bei einfachen Anwendungen funktioniert dies jedoch einwandfrei."