*
@Enumerator sagte in Initialisierungs-/Deinitialisierungsreihenfolge:
Hehe, da ist nichts kompliziert. Und ich gehöre auch zu den Programmierern die konsequent alle statischen Objekte in statischen Funktionen kapseln genau um z.B. Static Order Probleme zu vermeiden. Statische oder auch globale Variablen gibt es bei mir im Code grundsätzlich nicht, außer den besagten statischen globalen bool Flags die aber wie gesagt nur ein Hack für die automatische Registrierung der Typen sind. Dafür gibt es leider in C++ keine bessere Lösung.
Wenn man ein Meyers Singleton nutzt, eliminiert man bei der Konstruktion die Abhängigkeit von der Linkreihenfolge, was bei Deiner Lösung mit den Flags nicht der Fall ist. Es verbleibt das Problem der Destruktion. Solange alle statischen Objekte, die Du benötigst in einem Singleton gespeichert sind, ist das auch kein Problem. Problematisch sind dann nur dazu gelinkte Bibliotheken, falls diese irgendwelche Zeiger oder Objekte auf den selbst geschriebenen Code halten.
Ein Trauerspiel... Das ist hier aber auch nicht das Problem gewesen. Nach langem Debuggen kam ich auf die Idee, dass die Reihenfolge in der die Objekte zerstört werden womöglich von der Reihenfolge wie zu Libs gelinkt wurden abhängt. Ich linke diese nun in umgekehrter Reihenfolge was das Problem gelöst hat. Dieses Verhalten muss man aber ganz klar als Comiler-Bug bzw. C++ Design-Fehler bezeichnen.
Es ist definitiv kein Compilerfehler, er verhält sich korrekt im Sinne der Norm. Es ist ein Designfehler der Sprache, weil man das als implementation defined erlaubte. Ich halte das nicht für gut – aber man hat sich seit vielen Jahren nicht dazu durchringen können, das zu ändern.
In meinem Fall wurde also der TypeManager obwohl dieser als erstes initialisiert wurde nicht wieder als letztes deinitialisiert was das erwartete Verhalten gewesen wäre. Stattdessen wurden später erzeugte Objekte (aus dem Kontext einer anderen Lib) nach dem TypeManager deinitialisiert. Das heißt Anwender müssen die Reihenfolge in der die Libs gelinkt werden berücksichten. Das ist mehr als nur unschön.
Anscheinend war Dir das nicht bewusst. Das ist eine der Gründe weshalb man in C++ auf statische Variablen verzichten sollte. Ich habe selbst schon Singletons genutzt, aber noch nie in der Form, dass bei der Destruktion die Reihenfolge ein Rolle gespielt hätte. Wenn ich mich recht entsinne, was das bereits in C++ Komitee Thema und es wurde dafür bisher keine zufriedenstellende Lösung gefunden.