const ref初始化非常奇怪的输出

时间:2013-05-23 12:58:32

标签: c++ gcc

在我的一个项目中,我初始化了一个const std :: string&使用const char(在编译时知道),打印结果是......令人惊讶。

我在Ubuntu 12.04x32上使用gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)

例:

#include <string>
#include <iostream>
using namespace std;

class A
{
    public:
        A() : str("test"){};
    const string& str;
};

int main(int argc,char* argv[])
{ 
  A a;
  cout<<a.str<<endl;
  return 0;
};

所以,正常情况下,它会显示“测试”但是,这是我输出的prt:

testP�����utf8)����lower_case_table_names�xW�xW� ��     ����127.0.0.1utf8W�Y127.0.0.1 via TCP/IP127.0.0.1
        �5.5.31-0ubuntu0.12.04.1rootW�rootW�1����metadata_use_info_schema!P�XP�� VARaءpW�P4:����SHOW SESSION VARIABLES LIKE 'lower_case_table_names'`(���TCP/IP (3)@!K!K!�
.....
<charset name="gb2312">
  <family>Simplified Chinese</family>
  <description>GB2312 Simplified Chinese</description>
  <alias>chinese</alias>
  <alias>iso-ir-58</alias>
   <collation name="gb2312_chinese_ci"  id="24" order="Chinese">
    <flag>primary</flag>
   <flag>compiled</flag>
  </collation>
  <collation name="gb2312_bin"  id="86">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
</charset>

输出连续1000行。

所以我的问题很简单:为什么? (我尝试在“测试”结束时添加\ 0,但没有更改)

3 个答案:

答案 0 :(得分:11)

这是因为您正在取消引用悬空引用,这会为您的程序提供未定义的行为。根据C ++ 11标准的第12.2 / 5段:

  

[...]绑定到构造函数的ctor-initializer(12.6.2)中的引用成员的临时绑定一直持续到   构造函数退出。 [...]

这意味着,当您解除反复std::string时,构造函数初始化列表中绑定str的临时str对象将会死亡。

你有两种方法可以解决这个问题。将您的数据成员str设为const char*,或将其设为std::string(不是引用类型)。我个人会选择最后一个选项:

class A
{
public:
    A() : str("test") { }
    std::string str;
};

另请注意, function 定义后不需要分号。

答案 1 :(得分:2)

初始化string &需要string,而您正在提供const char *。编译器生成临时string,初始化string &,然后在尝试使用引用时销毁string,使您处于未定义的行为。

答案 2 :(得分:1)

str引用绑定到构造函数退出时消失的临时std::string