Konstruktion globaler Objekte
-
Hi,
ich habe ein komisches Problem. Und zwar bekomme ich in einem Konstruktor eines globalen Objekts ein "Access Violation" (es wird einfach ein Key, Value Pärchen in eine std::map eingetragen).
Meine Vermutung ist, dass das std::map Objekt noch gar nicht konstruiert wurde. Das ganze ist ein wenig kompliziert, denn das Objekt, in dessen Konstruktor die Access Violation auftritt gehört zu einer DLL. Das std::map Objekt allerdings zu einer LIB, die von der DLL eingebunden wurde.
Wie kann ich nun nachschauen, ob das std::map Objekt schon konstruiert ist, bzw. kann es überhaupt sein, dass es noch nicht konstruiert ist?
Nochmal ein kleines Stück Code:
std::map<int, SerialCom*> ClassTable; SerialCom::SerialCom() { m_isPortOpen = false; m_hWnd = NULL; m_PortHandle = NULL; m_CompleteEvent = NULL; m_Status = SCStatus::Idle; m_NumBytes = 0; m_LastError = SCError::NoError; m_OwnTimerID = SetTimer(NULL, 0, 0, NULL); ClassTable[m_OwnTimerID] = this; // hier tritt die Access Violation auf }
Jemand ne Idee?
-
Habe jetzt nur den Pointer global gemacht und das Objekt von Hand erstellt. Das geht.
Aber mich würde trotzdem interessieren, in welcher Reihenfolge die Objekte erzeugt werden!
-
Globale Objekte werden vor Eintritt in main initialisiert; es gibt darüberhinaus keine Garantie, wie die Reihenfolge der Initilisierung von mehreren Objekten ist, also bei
std::string a = "Hallo"; std::string b = "Welt";
gibt es keine Garantie, ob nun a oder b als erstes Initialisiert wird.
Mit globalen Objekten hatte ich auch schon öfters Probleme, namentlich mit der Kombination gcc mit nativen Linker auf einer HP-UX. Das Problem ist, daß der Linker zur Konstruktion globaler objekte einen bestimmten Code mit ins Binary schreiben muß, das wird nicht immer unterstützt.
-
Aber ich muss doch eine Garantie haben, dass wenn ich eine Bibliothek einbinde, dass dann alle globalen Objekte der Bib schon erstellt sind, oder nicht?
-
Die Reihenfolge der Konstruktion globaler Objekte ist nur dann festgelegt, wenn sie innerhalb derselben Übersetzungseinheit definiert sind. Im Stroustrup (§21.5.2 3. Ed.) ist eine Technik beschrieben, mit der sichergestellt wird, dass die Standardstreams vor ihrer ersten Benutzung konstruiert sind, die auch für andere Fälle nutzbar sein sollte.
-
Im Stroustrup (§21.5.2 3. Ed.) ist eine Technik beschrieben, mit der sichergestellt wird, dass die Standardstreams vor ihrer ersten Benutzung konstruiert sind, die auch für andere Fälle nutzbar sein sollte.
Ich weiß jetzt nicht aus dem Kopf, welche Technik Stroustrup beschreibt. Eine Technik hört auf jeden Fall auf den Namen "Schwartz-Counter" bzw. "Nifty-Counter"