2008-09-13 7 views
-3

Ich werde bald einen Artikel auf my blog veröffentlichen, aber ich möchte überprüfen, dass ich zuerst nichts verpasst habe.C++ Quiz - Singletons

Finden Sie ein Beispiel, das ich verpasst habe, und ich zitiere Sie auf meinem Post.

Das Thema ist fehlgeschlagen Singleton Implementierungen: In welchen Fällen können Sie versehentlich mehrere Instanzen eines Singleton erhalten?

Bisher habe ich kommen mit:

  • Race-Bedingung auf den ersten Aufruf instance()
  • Einarbeitung in mehrere DLLs oder DLL und ausführbare
  • Template Definition eines Singleton - tatsächlich getrennte Klassen

Alle anderen Möglichkeiten, die ich vermisse - vielleicht mit Vererbung?

+0

Ich fühlte, dass es vollständige Offenlegung war, wie ich Informationen in diesem Beitrag in meinem Beitrag verwenden möchte. Tut mir leid, habe mich irgendwie lustig gefühlt, aber es bleibt eine interessante Frage, nicht wahr? – theschmitzer

+0

Der Beitrag ist fertig. Vielen Dank. – theschmitzer

Antwort

3

Wenn Sie ein statisches Instanzfeld verwenden, das Sie in Ihrer cpp-Datei initialisieren, können Sie mehrere Instanzen (und noch schlimmeres Verhalten) erhalten, wenn die Initialisierung einiger statischer/globaler Instanzen versucht, eine Instanz Ihres Singletons zu erhalten. Dies liegt daran, dass die Reihenfolge der statischen Initialisierung über die Kompilierungseinheiten nicht definiert ist.

+0

Sie sagen also, dass der globale Speicher, der von _instance verwendet wird, auf NULL initialisiert wird. Eine andere globale Variable ruft instance() auf, wobei Instanz # 1 zugewiesen wird() weist ein zweites Mal zu? – theschmitzer

+0

Also die Frage ist, wie sieht der globale Speicher vor der Initialisierung der globalen Datenmitglieder ... – theschmitzer

+0

Der Punkt ist, dass der globale Speicher auf NULL vor main initialisiert wird, aber nicht unbedingt, bevor Sie eine Singleton-Instanz angefordert haben. –

1

Vererbung sollte kein Problem sein, solange der Ctor privat ist.

Wenn Sie jedoch den Kopierkonstruktor nicht ablehnen, können Benutzer die Singleton-Instanz absichtlich kopieren. Eine private Übernahme von boost::noncopyable ist der einfachste Weg, dies zu verhindern.

+0

Anstatt Vererbung zu verwenden, ist es viel besser, nur die beiden problematischen Methoden als private zu deklarieren. Speichert eine Aufnahme von Boost, wenn Sie es nicht einfügen wollen, und Vererbung verwenden (sowohl geringe Kosten, aber gut zu wissen) – hazzen

+0

Das ist eine gültige Option und was ich früher getan habe. Warum postest du das nicht als alternative Antwort? BTW, besser ist subjektiv ... Die Methode boost :: noncopyable liefert einen Compilerfehler mit einer bestimmten Zeilennummer. Ihre Methode führt zu einem Link-Zeit-Fehler, der für Neueinsteiger schwieriger zu finden ist. –