Frage

Ist globaler Speicher initialisiert in C ++? Und wenn ja, wie?

(Zweite) Klarstellung:

Wenn ein Programm gestartet wird, was in dem Speicherraum ist, die globalen Speicher werden wird, vor der Primitiven initialisiert werden? Ich versuche zu verstehen, wenn es auf Null gesetzt wird, oder Müll zum Beispiel.

Die Situation ist: kann ein Singleton Bezug gesetzt werden - über einen instance() Anruf vor seiner Initialisierung:

MySingleton* MySingleton::_instance = NULL;

und erhält zwei Singleton-Instanzen als Ergebnis?

meine C ++ Quiz finden Sie auf auf mehrere Instanzen eines Singleton ...

War es hilfreich?

Lösung

Ja globale Primitiven auf NULL initialisiert werden.

Beispiel:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

Sie können keine Annahmen über Klassen, Strukturen machen, Arrays, Speicherblöcke auf dem Heap ...

Am sichersten ist es einfach immer alles zu initialisieren.

Andere Tipps

Aus dem Standard:

  

Objekte mit statischer Speicherdauer (3.7.1) betragen Null initialisiert (8.5), bevor eine andere Initialisierung erfolgt. Zero-Initialisierung und die Initialisierung mit einem konstanten Ausdruck kollektiv genannt statische Initialisierung ; alle anderen Initialisierung ist dynamische Initialisierung . Objekte von POD [plain old data] Typen (3.9) mit statischer Dauer Speichern mit konstanten Ausdrücken initialisiert (5.19) werden vor nimmt jede dynamische Initialisierung erfolgt initialisiert werden. Objekte mit statischer Speicherdauer in Namespacebereich in derselben Übersetzungseinheit definiert und dynamisch initialisiert werden in der Reihenfolge initialisiert werden, in dem ihre Definition in der Übersetzungseinheit angezeigt wird. [Anmerkung: 8.5.1 beschreibt die Reihenfolge, in der Gesamt Mitglieder initialisiert werden. die Initial-   isierung der lokalen statischen Objekten wird in 6.7 beschrieben.]

Also ja, Globals, die statische Speicherdauer haben wird initialisiert. Globals zugeordnet, zum Beispiel auf dem Heap wird natürlich nicht automatisch initialisiert werden.

Von der embedded world ...

Der Code wird in drei Arten von Speichern zusammengestellt:
   1. .data: initialisierten Speicher
   2. .text: Konstanten und Code
   3. .bss: nicht initialisierten Speicher (initialisiert auf 0 in C ++, wenn nicht explizit initialisiert)

Globals gehen in .data wenn initialisiert. Wenn nicht sie platziert sind in .bss und zero'ed in premain Code.

Variablen mit statischem / global Gültigkeitsbereich deklariert wird immer unter VC initialisiert ++ zumindest.

Unter bestimmten Umständen kann es tatsächlich einen Unterschied im Verhalten zwischen sein:

int x = 0;

int main() { ... }

und

int x;

int main() { ... }

Wenn Sie Datensegmente geteilt verwenden, dann VC ++ mindestens nutzt das Vorhandensein einer expliziten Initialisierung zusammen mit einem #pragma data_seg, um zu bestimmen, ob eine bestimmte Variable in dem freigegebenen Datensegment oder dem privaten Datensegment für einen Prozess gehen sollte.

Für zusätzlichen Spaß überlegen, was passiert, wenn Sie ein statisches C ++ Objekt mit Konstruktor / Destruktor in einem gemeinsamen Datensegment deklariert haben. Der Konstruktor / Destruktor wird jedes Mal, wenn die exe / dll wird an das Datensegment genannt, die mit ziemlicher Sicherheit ist nicht das, was Sie wollen.

Mehr Details in diesem KB-Artikel

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top