用自己初始化一个字符串(C ++)

时间:2016-03-13 18:42:54

标签: c++ string

以下代码在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;

我理解,在这两种情况下,这不是初始化字符串变量的常用方法。但是,有人可以解释这段代码的真正错误吗?另外,为什么第一种情况下输出不同?

3 个答案:

答案 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