最近我在以下代码中找到了该错误:
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
{}
此代码是否具有未定义的行为,如第一个代码片段?
答案 0 :(得分:3)
不,message(s)是一个std :: string,因此你可以获取char缓冲区内容的副本。
临时持续使用您调用它的函数的范围 - 在本例中为构造函数。