临时对象的生命周期

Lifetime of temporary objects

本文关键字:周期 生命 临时对象      更新时间:2023-10-16

我遇到了以下代码(大致):

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()这样的函数不是用来缓存的,因为即使它指向一个非临时对象,它也可以通过重新分配它所指向的字符串而失效。