gpt4 book ai didi

ostringstream 的 C++ 奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:25 24 4
gpt4 key购买 nike

标准中对以下行为有任何解释吗?

以下代码:

#include <sstream>
#include <iostream>

using namespace std;

int main()
{
ostringstream os1;
ostringstream os2;

os1 << 1 << " " << 2;
os2 << 1 << " " << 2 << " " << 3;

const char *p = os1.str().c_str();

cout << os2.str() << endl;
cout << p << endl;

return 0;
}

显示输出:

1 2 3
1 2 3

但是,我希望它显示:

1 2 3
1 2

看起来 os1 对象在某种程度上受到 os2 的影响,如果我删除 os2.str() 调用,示例会正常运行。

如果 Solaris Studio 12.2 和 G++ 4.8.1 的行为相同,我已经尝试过该示例。

感谢您的帮助!

最佳答案

const char *p = os1.str().c_str();

这是问题所在,在上面一行。

os1.str() 通过复制内部字符串缓冲区返回一个临时字符串对象。你正在获取临时对象的 .c_str(),它在完整表达式的末尾被销毁。结果是,当您使用 std::cout 打印时,p 指向被销毁的对象。

也就是说,您的程序调用了未定义行为 (UB)。

试试这个:

auto s = os1.str();  
const char *p = s.c_str(); //s is not a temporary object anymore!

现在它给出 correct output (这是 your code — 幸运的是,即使 coliru 也提供了与您在机器上观察到的相同的输出。请注意,此输出不能保证正是因为代码调用了 UB .).

关于ostringstream 的 C++ 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19477703/

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