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

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

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

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

Я понимаю, что присвоение или добавление чего-то к NULL неверно. Но тихо умирать тоже нехорошо. Как я должен обрабатывать/отлаживать эти ситуации? И почему программа умирает?Почему моя программа на C++ отключается при использовании объекта NULL?

+2

Как вы можете увидеть [здесь] (http://www.cplusplus.com/reference/string/string/string/), инициализация строки с нулевым ptr приводит к _undefined behaviour_ – norisknofun

+3

Объект 'std :: string', когда построенный по умолчанию (как в' std :: string n; ') пуст. Если вам нужна пустая строка, все, что вам нужно сделать, это создать объект, никакой специальной или явной инициализации не потребуется. –

+1

@NathanOliver Проблема не в том, что NULL является указателем. Это то, что это нулевой указатель. – juanchopanza

ответ

3

Ваша программа может свободно выполнять любые действия std::string, на которые у вас есть предпочтения. std::string имеет конструктор, принимающий const char* s. Однако это включает в себя:

Создает строку с содержимым, инициализированным копией строки символов с нулевым символом, на которую указывает s. Длина строки определяется первым нулевым символом. Поведение не определено, если s не указывает на массив не менее Traits::length(s)+1 элементов CharT, , включая случай, когда s является нулевым указателем.

(курсив мой)

Via cppreference

+0

Правильно ли это, хотя NULL не имеет связанного с ним типа (кроме, возможно, 'void *')? Я бы поверила, что NULL будет преобразован в символ, а затем символ, назначенный строке. –

+0

@ThomasMatthews 'void *' из 'NULL' выбирает перегрузку' const CharT * '. –

0

Вы должны просто оставить n неинициализированным вместо этого, присвоение его NULL в C++ 11 может привести к неопределенному поведению. Не должно быть экземпляра, в котором вам нужно назначить NULL.

+2

'n' не будет унифицирован, потому что это тип класса. Его конструктор будет правильно инициализировать его до пустой строки. –

+0

s/uninitialized/default initialized/ – juanchopanza

Смежные вопросы