我遇到了以下代码(大致):
struct StringBuffer {
StringBuffer(const char* string) {strcpy(m_buffer, string);}
const char* c_str() const {return m_buffer;}
char m_buffer[128];
};
std::string foobar() {
const char* buffer = StringBuffer("Hello World").c_str();
return std::string(buffer);
}
我假设在
行之后: const char* buffer = StringBuffer("Hello World").c_str();
buffer
是指向一个指针在解构的StringBuffer
对象?
最后回答你的问题,是的,buffer
将是一个偏离的指针。
要回答关于临时值的生命周期的更一般的问题,我建议您阅读下面的参考:
…所有临时变量在(词法上)包含创建它们的点的完整表达式求值的最后一步被销毁…
对于您的情况,这意味着一旦对buffer
的赋值完成,临时对象将被销毁。
可以。
按照惯例,像std::string::c_str()这样的函数不是用来缓存的,因为即使它指向一个非临时对象,它也可以通过重新分配它所指向的字符串而失效。