Zeigerinitialisierung



  • Hallo,

    werden Zeigervariablen nach Standard mit 0 initialisiert?

    Hintergrund: Ich habe:

    std::map<std::string, blah*> ptrmap
    

    Wenn ich nun:

    blah* p = ptrmap["blah"]
    

    aufrufe, welchen Wert hat p, wenn der Zeiger vorher noch nicht in der map war? Ist er 0 oder einfach einen zufälligen Wert? Was sagt der C++-Standard?



  • Der C++ Standard sagt, daß der Wert im Zweifelsfall default-initialisiert wird. Aber was das für build-in-Typen genau heißt, bin ich mir nicht ganz sicher.



  • tntnet schrieb:

    werden Zeigervariablen nach Standard mit 0 initialisiert?

    Nein, Variablen werden grundsätzlich nicht initialisiert. Ausnahme sind statische und globale Variablen, und natürlich Objekte mit Konstruktoren.

    welchen Wert hat p, wenn der Zeiger vorher noch nicht in der map war? Ist er 0 oder einfach einen zufälligen Wert? Was sagt der C++-Standard?

    0. Der operator[] von std::map fügt ein default-initialisiertes Objekt ein, wenn der Schlüssel noch nicht in der Map war, und gibt es zurück. Im Falle von Pointern und anderen primitiven Typen ist das also 0.



  • Bashar schrieb:

    0. Der operator[] von std::map fügt ein default-initialisiertes Objekt ein, wenn der Schlüssel noch nicht in der Map war, und gibt es zurück. Im Falle von Pointern und anderen primitiven Typen ist das also 0.

    und was ist, wenn man 0 als datum in die map eingetragen hat?
    dann kann man's ja nicht von nichtvorhandenen einträgen unterscheiden...
    🙂



  • Das kannst du bei der map<> sowieso nicht, außer du definierst ein default-konstruiertes Objekt als "nicht verfügbar". Um festzustellen, ob ein Schlüssel schon in der map vorkommt, gibt es andere Methoden (find()).



  • pale dog schrieb:

    und was ist, wenn man 0 als datum in die map eingetragen hat?
    dann kann man's ja nicht von nichtvorhandenen einträgen unterscheiden...
    🙂

    Der operator[] fügt automatisch ein wenn nicht vorhanden. Damit ist der Rückgabewert von operator[] immer ein in der Map existierendes Objekt. Ist also vollkommen richtig, Deine Beobachtung.



  • pale dog schrieb:

    und was ist, wenn man 0 als datum in die map eingetragen hat?
    dann kann man's ja nicht von nichtvorhandenen einträgen unterscheiden...
    🙂

    Wenn man das will dann ist op[] die falsche Methode.



  • Bashar schrieb:

    0. Der operator[] von std::map fügt ein default-initialisiertes Objekt ein, wenn der Schlüssel noch nicht in der Map war, und gibt es zurück. Im Falle von Pointern und anderen primitiven Typen ist das also 0.

    Das ist genau die Frage, ob die default-Initialisierung einen Zeiger auf 0 setzt. Ich vermute mal eher nicht.



  • tntnet schrieb:

    Das ist genau die Frage, ob die default-Initialisierung einen Zeiger auf 0 setzt. Ich vermute mal eher nicht.

    Doch, tut sie. Bei primitiven Typen ist default initialization gleich zero initialization, siehe Abschnitt 8.5 im Standard.



  • Bashar schrieb:

    tntnet schrieb:

    Das ist genau die Frage, ob die default-Initialisierung einen Zeiger auf 0 setzt. Ich vermute mal eher nicht.

    Doch, tut sie. Bei primitiven Typen ist default initialization gleich zero initialization, siehe Abschnitt 8.5 im Standard.

    Das ist doch genau das, was ich hören wollte.

    Danke für die Information.


Anmelden zum Antworten