rai*_*ner 4 c++ undefined-behavior language-lawyer
根据以下答案考虑以下代码:
#include <iostream>
#include <sstream>
class StringBuilder {
public:
template <typename T> inline StringBuilder &operator<<(T const &t) {
ss << t;
return *this;
}
inline char const * c_str() {
return ss.str().c_str();
}
private:
std::stringstream ss;
};
void foo(const char *x) {
std::cout << x << std::endl;
}
int main() {
foo((StringBuilder() << "testing " << 12 << 3 << 4).c_str());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
foo()使用临时StringBuilder的返回值调用是否会以任何方式导致UB?
我问的原因是上面的例子效果很好,但在现实生活中,我使用的是一个库,其中包含日志工具,使用这个库我会得到不正确的输出(日志功能需要我的char*正确但在内部覆盖它,这使我相信内存不再有效).
是的,但不是因为你的想法.
StringBuilder函数调用中的临时函数在foo返回之后不会被销毁,所以没关系.
但是,该c_str()方法返回调用的结果.str().c_str(),并且由此返回的临时字符串str()作为StringBuilder::c_str()返回被销毁,这意味着返回的指针在外部是无效的.使用此指针会导致UB.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |