Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的C++;程序在使用空对象时自动退出? 字符串n=NULL; cout_C++ - Fatal编程技术网

C++ 为什么我的C++;程序在使用空对象时自动退出? 字符串n=NULL; cout

C++ 为什么我的C++;程序在使用空对象时自动退出? 字符串n=NULL; cout,c++,C++,您应该让n保持未初始化状态,而在C++11中将其赋值为NULL可能会导致未定义的行为。不应该有一个实例需要将其赋值为NULL。您的程序可以自由执行您选择的std::string的任何实现std::string有一个构造函数采用const char*s。然而,这涉及: 使用由s指向的以null结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果s未指向图表的至少Traits::length(s)+1元素的数组,则行为未定义,包括s为空指针的情况。 (强调矿山) 通过可以看

您应该让
n
保持未初始化状态,而在C++11中将其赋值为NULL可能会导致未定义的行为。不应该有一个实例需要将其赋值为NULL。

您的程序可以自由执行您选择的
std::string
的任何实现
std::string
有一个构造函数采用
const char*s
。然而,这涉及:

使用由
s
指向的以null结尾的字符串的副本初始化的内容构造字符串。字符串的长度由第一个空字符决定。如果
s
未指向
图表
的至少
Traits::length(s)+1
元素的数组,则行为未定义,包括s为空指针的情况。

(强调矿山)


通过

可以看到,当默认构造(如
std::string n;
)为空时,使用空ptr初始化字符串会导致未定义的行为a
std::string
对象。如果需要空字符串,只需创建对象,无需进行特殊或显式初始化。@NathanOliver问题不在于NULL是指针。这是因为它是空指针。@NathanOliver
std::string
可以用指针初始化。C++允许转换构造函数。代码> N< /代码>不会是统一的,因为它是类类型。它的构造函数将正确地将其初始化为空字符串。即使NULL没有与之关联的类型(除了
void*
),这是否正确?我相信NULL将被转换为字符,然后被分配给字符串。@ThomasMatthews
void*
of
NULL
选择
const CharT*
重载。
string n = NULL;

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

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

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