最近我发现了以下代码中的错误:
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();) 产生悬空指针。
我修复这个错误没有任何问题,但是,我在项目中有很多地方,看起来像这样:
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
{}
此代码是否具有未定义的行为,如第一个代码片段?
不,消息是一个 std::string,因此您此时会获取 char 缓冲区内容的副本。
临时的持续时间是您调用它的函数的范围 - 在本例中是构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)