以下代码在Linux(g ++ 4.8.4)和Windows(VS Express 2013)上编译,但在执行时会产生不同的结果。
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string str = str;
cout << "'str.length()': "
<< str.length() << endl;
return 0;
}
在Linux上我得到:
'str.length()': 140187593065792
在Windows上我得到:
'str.length()': 0
另外,如果我更改了如下所示的初始化语句,那么它符合但它在运行时崩溃(在Linux上我得到:在抛出'std :: bad_alloc'的实例后调用terminate):
string str = str + str;
我理解,在这两种情况下,这不是初始化字符串变量的常用方法。但是,有人可以解释这段代码的真正错误吗?另外,为什么第一种情况下输出不同?
答案 0 :(得分:6)
评估初始化程序时,已声明str
,但尚未以任何方式构造它。它的“价值”是完全不确定的。您的程序有不确定的行为。
答案 1 :(得分:4)
此代码深入到未定义行为的范围内。在形式上,一旦看到对象的名称,它就在范围内并且可以用作初始化器。但由于它的构造函数没有运行,因此对象本身并没有被合理地初始化,并且在它自身之上复制它本身并不一定会把它变成一个有效的对象。该发生的总会发生;不要这样做。
答案 2 :(得分:1)
从正式的角度来看,它是未定义的行为,你可以在此结束。
从实际的角度来看,当你声明字符串的本地实例时,它的内存具有随机值。因此,指向字符数组的指针无效,长度无效等等。
为什么VS和g ++的结果不同?您可能在调试模式下运行VS程序,VS可能会初始化某些内容What are some reasons a Release build would run differently than a Debug build