Singletons in richtiger Reihenfolge löschen
-
Hallo,
ich habe in meinem Programm zwei Singletons. Das Konstrukt eines Singleton garantiert ja, dass die Singletons in einer bestimmten Reihenfolge konstruiert werden. Aber gibt es auch einen (einfachen) Weg, zu garantieren, dass sie in einer bestimmten Reihenfolge gelöscht werden?
Ich habe mich mit der Implementierung übrigens an "Design Patterns" gehalten.
-
Ja, es ist ja dir überlassen wie die Singleton erstellt wird, du hast ja die inetrne static, da kansnte genauso mit new eine Singleton anlegen, das ermöglicht dir gezieltes Löschen der Instanz, du mußt dann aber aufpassen das die zugreifenden Klassen ne gültigkeitsprüfung machen nicht das sie auf die nicht existente Instanz zugreifen.
Alternativ kannst du nur dafür sorgen das die klassen ind er richtigen Reihenfolge erstellt werden, falls das Möglich ist.
-
ingobulla schrieb:
Aber gibt es auch einen (einfachen) Weg, zu garantieren, dass sie in einer bestimmten Reihenfolge gelöscht werden?
Kurze Antwort: nein. Zumindest nicht einfach. Die Reihenfolge, in der statische Objekte nach Ende der main() abgeräumt werden, ist meines Wissens nicht spezifiziert, wenn sie in verschiedenen Übersetzungseinheiten liegen. Es gibt verschiedene Ansätze dafür, das zu lösen. Alexandrescu hat in Modern C++ Design z.B. die Implementierung eines "PhoenixSingleton" gezeigt, das wiederaufersteht, wenn nach dem Abräumen nochmal darauf zugegriffen wird. So ein Singleton kann natürlich keinen internen Zustand haben. Eine andere Möglichkeit wäre, ein einzelnes übergeordnetes Singleton zu haben, das sich ums Abräumen der anderen Singletons kümmert, wenn es zerstört wird. Das sähe dann natürlich etwas anders aus als die GoF-Implementation.
-
pumuckl schrieb:
...
Aber ist die static Variable in der die Singleton liegt nicht auch eine Normale variable die beim erstmaligen Aufruf der Klasse auf den Stack gelegt wird und damit einen deffinierten zeitpunkt fürs verschwinden hätte?
-
pumuckl schrieb:
...
Es gibt im Modern C++ Design: Generic Programming and Design Patterns Applied von Andrei Alexandrescu noch Singletons mit Longevity. Bei denen kann man die Reihenfolge der Zerstörung über Prioritäten steuern.
-
Xebov schrieb:
Aber ist die static Variable in der die Singleton liegt nicht auch eine Normale variable die beim erstmaligen Aufruf der Klasse auf den Stack gelegt wird und damit einen deffinierten zeitpunkt fürs verschwinden hätte?
Nein. Stack-Variablen gehören zur automatischen Speicherklasse. Diese werden bei Verlassen des Scopes automatisch zerstört. Das Folgende schreibt zwar niemand, aber wäre explizit:
auto int i;Variablen mit vorgestelltem
statichingegen gehören zur statischen Speicherklasse. Diese Variablen existieren bis zum Programmende.static int i;Darüber hinaus gibt es noch zwei weitere Speicherklassen:
extern int i; register int i;
-
Nexus schrieb:
Nein. Stack-Variablen gehören zur automatischen Speicherklasse. Diese werden bei Verlassen des Scopes automatisch zerstört.
OK, danke für die Übersicht, wuste ich bisher garnicht, dachte immer das fliegt alels auf den selben Stack.