Wann werden globale Variablen erstellt?

8

Ich habe ein Stück Code wie folgt strukturiert:

%Vor%

Jetzt wird ein segfault ausgegeben, valgrind sagt, dass die map noch nicht erstellt wurde. Wie funktioniert es, wie soll ich es ändern?

    
darenn 27.10.2013, 13:52
quelle

4 Antworten

10

C ++ definiert keine Reihenfolge für den Fall, dass globale Variablen während des Programmstarts erstellt werden. a könnte zuerst initialisiert werden, bevor something erzeugt wird, was das obige Problem verursachen würde. Wenn Sie beginnen, globale Variablen zu konstruieren, die von anderen globalen Variablen abhängen, die initialisiert werden, dann stoßen Sie auf die klassische statische Initialisierungsreihenfolge fiasco .

Eine einfache Möglichkeit, das obige Szenario zu beheben, besteht darin, something statisch zu machen und in die Funktion create zu verschieben.

%Vor%

Das garantiert, dass something beim ersten Aufruf von create erstellt wird.

    
greatwolf 27.10.2013, 13:59
quelle
8

Alle globalen Variablen werden vor der Eingabe von main () erstellt, aber ihre Reihenfolge der Konstruktion zwischen verschiedenen Übersetzungseinheiten wird nicht vom c ++ - Standard angegeben. Ihre Reihenfolge der Konstruktion innerhalb der gleichen Übersetzungseinheit ist in der Reihenfolge der Spezifikation.

Sie könnten etwas bilden, das vom Standard garantiert wird. Etwas wie das:

%Vor%

Die Map wird beim ersten Aufruf der Funktion mymap () erstellt.

    
BЈовић 27.10.2013 13:58
quelle
3

Die Reihenfolge, in der globale Variablen von verschiedenen Übersetzungseinheiten (d. h. die sich in verschiedenen * .cpp-Dateien befinden) initialisiert werden, ist nicht durch den Standard definiert. Daher ist undefined behaviour darauf angewiesen. Siehe auch:

vines 27.10.2013 13:57
quelle
2

Die Reihenfolge, in der globale Variablen (dh Variablen im Namespacebereich) erstellt werden, lautet folgendermaßen:

  • die Reihenfolge, in der sie erscheinen, in einer Übersetzungseinheit
  • nicht spezifiziert, von einer Übersetzungseinheit zur anderen

Dies ist etwas, das Sprachen mit Modulen nicht leiden, aber leider ein häufiges Problem in C ++. Wenn Sie funtionlokale statische Variablen verwenden, kann bei der ersten Verwendung eine Initialisierung ausgelöst werden, die dieses Problem im Allgemeinen löst.

Beispiel für statische lokale:

%Vor%     
Matthieu M. 27.10.2013 14:34
quelle

Tags und Links