basic_ostringstream :: str悬空指针

时间:2015-12-22 08:56:18

标签: c++ c++11

最近我在以下代码中找到了该错误:

ostringstream o;
o << "some string";
const char* s = o.str().c_str(); // empty string instead of expected "some string"

这是由cppreference.com解释的: str返回的底层字符串的副本是一个临时对象,它将在表达式的末尾被破坏,因此直接调用str的结果c_str()( )(例如在auto * ptr = out.str()。c_str();)导致悬空指针。

我修复这个bug没有任何问题,但是,我在项目中有很多地方,看起来像这样:

ostringstream o;
o << "error description";
throw my_exception(o.str().c_str());

...

my_exception::my_exception(const char* s) :
    message(s)     // message is std::string
{}

此代码是否具有未定义的行为,如第一个代码片段?

1 个答案:

答案 0 :(得分:3)

不,message(s)是一个std :: string,因此你可以获取char缓冲区内容的副本。

临时持续使用您调用它的函数的范围 - 在本例中为构造函数。