根据this answer考虑以下代码:
#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;
}
使用临时foo()
的返回值调用StringBuilder
会以任何方式导致UB吗?
我问的原因是上面的例子效果很好,但在现实生活中我使用的是一个库,其中包含日志工具,使用这个库我会得到不正确的输出(日志记录)函数正确地取我的char*
但在内部覆盖它,这使我相信内存不再有效。)
答案 0 :(得分:7)
是的,但不是因为你的想法。
函数调用中的临时StringBuilder
在foo
返回之前不会被销毁,所以没关系。
但是,c_str()
方法返回调用.str().c_str()
的结果,并且str()
返回的临时字符串在StringBuilder::c_str()
返回时被销毁,这意味着指针返回外面无效。使用此指针会导致UB。