Destruierungszeitpunkt / -Reihenfolge von lokalen statischen Variablen (nicht PODs)
-
Hallo,
Folgende Frage in Bezug auf lokale statische Klassen-Instanzen:
class A { public: void Irgendwas() { // irgendwas hier } }; A Foo() { static A a; return a; } int main(int argc, char *argv[]) { Foo().Irgendwas(); return 0; }
Meine Frage zielt auf folgendes ab:
1. Angenommen das A Objekt wäre eine global statische Variable +
2. Angenommen es gäbe zusätzlich andere globale statische Variablen die eine Referenz auf A hielten
Dann wären Konstruktions-Destruktions Reihenfolgen nicht garantiert (global destruction fiasco).Was aber wenn A mit obiger Methodik angelegt wird. Gibt es da das Problem immer noch ?
-
teddybear schrieb:
Was aber wenn A mit obiger Methodik angelegt wird. Gibt es da das Problem immer noch ?
Es ist garantiert, dass das static-Objekt in der Funktion nach dem globalen static-Objekt angelegt wird. Das heißt, die Konstruktion läuft garantiert richtig.
Doch genauso ist garantiert, dass das lokale static-Objekt vor dem globalen zerstört wird. Falls das globale Objekt nach der Zerstörung des lokalen Objekts noch einmal seine Referenz auf dieses lokale Objekt benutzt (z.B. in seinem Destruktor), dann knallt's.
Eine Methode, dies zu verhindern, wäre anstatt des lokalen Objekts nur einen shared_ptr auf ein dynamisches Objekt zu halten. Es gibt auch andere Methoden, die du unter Google mit dem Stichwort "Static initialization order fiasco" finden kannst.
Falls das keine rein akademische Frage gewesen sein sollte: Globale Programmzustände (lokale static Variablen zählen auch dazu) sind normalerweise sehr fehleranfällig und sollten vermieden werden. Sie sind nur sehr selten zwingend notwendig.