std::ostringstream没有返回有效的字符串。

6
我尝试使用std :: ostringstream将数字转换为字符串(char *),但似乎无效。这是我的代码:
#include <windows.h>
#include <sstream>

int main()
{
    std::ostringstream out;
    out << 1234;

    const char *intString = out.str().c_str();

    MessageBox(NULL, intString, intString, MB_OK|MB_ICONEXCLAMATION);

    return 0;
}

结果消息框中没有任何文本。

这让我相信,调用out.str().c_str()返回了一个无效的字符串,但我不确定。由于我已经缩减了这个程序并仍然遇到问题,所以我一定犯了一个非常简单的错误。希望能得到帮助!


+1 对于包含 SSCCE 的明确简洁问题。尽管我在 Windows 7 上使用 GCC 4.7.1 能够得到正确的文本。 - chris
4
@chris:未定义行为是未定义的。 ;-] (注:该句话为英文,下同) - ildjarn
1个回答

12

out.str() 返回一个std::string类型的值,这意味着您正在对临时变量调用.c_str()。因此,当初始化 intString 时,它已经指向无效(被销毁的)数据。

缓存.str()的结果并使用它进行操作:

std::string const& str = out.str();
char const* intString = str.c_str();

2
const& 看起来非常别扭。为什么不直接使用 const std::string mystring(out.str()); - rubenvb
1
@rubenvb:你认为它们有什么不同之处? - ildjarn
嗨,ildjarn。我猜@rubenvb的意思是:当开发人员阅读const std::string str(out.str());时,他立即理解str是一个副本。但是const std :: string&str = out.str();给人的印象是str只是对由其他变量处理的string的引用。第二种情况可能会令人困惑,不是吗? - oHo
@olibre:第二种情况只是对临时变量的引用... ;-] - ildjarn
是的,我昨天问了关于未命名临时对象的引用的问题,并提到了你上面的答案。(注意:我的问题不是SO上任何其他问题的重复,其他问题是关于函数返回对象的生命周期)现在我明白了这个C++技巧 :-) 但它并不明显!干杯;-) - oHo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接