我遇到了以下代码(粗略地):
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
对象中的指针?
答案 0 :(得分:7)
要在最后回答你的问题,是的,buffer
将是一个迷路指针。
要回答有关临时值生命周期的更一般性问题,建议您阅读this reference说明:
...所有临时演员都被摧毁,作为评估全曲面的最后一步(词法上)包含创建它们的点......
对于您的情况,这意味着一旦完成buffer
的分配,临时对象就会被破坏。
答案 1 :(得分:4)
是
按照惯例,像std :: string :: c_str()这样的函数不用于缓存,因为即使它指向非临时对象,它也可能通过重新分配它指向的字符串而失效。