2016-04-05 8 views
-5
string n = NULL; 

cout << "blah: " << n << " foo!" << endl; // never printed 

cout << "BLAH" << endl; // never printed 

cerr << "FOO" << endl; // never printed 

Ich verstehe das Zuweisen oder Anhängen von etwas an NULL ist nicht richtig. Aber still sterben ist auch nicht gut. Wie soll ich mit diesen Situationen umgehen/debuggen? Und warum stirbt das Programm?Warum wird mein C++ - Programm automatisch beendet, wenn ein NULL-Objekt verwendet wird?

+2

Wie Sie [hier] sehen (http://www.cplusplus.com/reference/string/string/string/), Die Initialisierung eines Strings mit einem Null-Ptr führt zu _undefined behaviour_ – norisknofun

+3

Ein 'std :: string'-Objekt, wenn der Standard-Konstruktor (wie in' std :: string n; ') leer ist. Wenn Sie eine leere Zeichenfolge wünschen, müssen Sie nur das Objekt erstellen, es muss keine spezielle oder explizite Initialisierung vorgenommen werden. –

+1

@NathanOliver Das Problem ist nicht, dass NULL ein Zeiger ist. Es ist, dass es der Nullzeiger ist. – juanchopanza

Antwort

3

Ihr Programm ist frei zu tun, was auch immer die Implementierung von std::string Sie haben. std::string hat einen Konstruktor unter const char* s. Dies beinhaltet jedoch:

Konstruiert die Zeichenfolge mit dem Inhalt initialisiert mit einer Kopie der nullterminierten Zeichenfolge, auf die s zeigt. Die Länge der Zeichenfolge wird durch das erste Nullzeichen bestimmt. Das Verhalten ist nicht definiert, wenn s nicht auf ein Array von mindestens Traits::length(s)+1 Elementen von CharT, zeigt, einschließlich des Falls, wenn s ein Nullzeiger ist.

(Hervorhebung von mir)

Via cppreference

+0

Ist das korrekt, obwohl NULL keinen Typ zugeordnet hat (außer vielleicht 'void *')? Ich würde glauben, dass NULL in Zeichen und dann in das Zeichen umgewandelt werden würde. –

+0

@ThomasMatthews 'void *' von 'NULL' wählt die' const CharT * 'Überladung aus. –

0

Sie sollten einfach n nicht initialisiert lassen, das Zuweisen von NULL in C++ 11 kann zu undefiniertem Verhalten führen. Es sollte keine Instanz geben, in der Sie NULL zuweisen müssen.

+2

'n' wäre nicht unitialisiert, da es sich um einen Klassentyp handelt. Sein Konstruktor initialisiert es ordnungsgemäß mit einer leeren Zeichenfolge. –

+0

s/nicht initialisiert/default initialisiert/ – juanchopanza

Verwandte Themen