gpt4 book ai didi

c++ - 带有 const ref initialise 的非常奇怪的输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:11:11 26 4
gpt4 key购买 nike

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

我在 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;
};

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

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,但没有改变)

最佳答案

那是因为您取消引用了一个悬空引用,这给您的程序带来了未定义的行为。根据 C++11 标准的第 12.2/5 段:

[...] A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits. [...]

这意味着临时 std::string str 的对象绑定(bind)在构造函数的初始化列表中将在您取消引用时失效 str .

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

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

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

关于c++ - 带有 const ref initialise 的非常奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16714595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com