首页 >后端开发 >C++ >函数调用中何时调用临时 C 对象的析构函数?

函数调用中何时调用临时 C 对象的析构函数?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-13 11:57:14190浏览

When is a Temporary C   Object's Destructor Called in a Function Call?

C 中临时对象的保证生命周期

问题:

临时对象的析构函数何时被调用?在函数调用中创建但不用作参数?具体来说,请考虑以下代码:

class StringBuffer
{
public:
    StringBuffer(std::string & str) : m_str(str)
    {
        m_buffer.push_back(0);
    }
    ~StringBuffer()
    {
        m_str = &m_buffer[0];
    }
    char * Size(int maxlength)
    {
        m_buffer.resize(maxlength + 1, 0);
        return &m_buffer[0];
    }
private:
    std::string & m_str;
    std::vector<char> m_buffer;
};

std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);

答案:

临时 StringBuffer 对象的析构函数在 调用 GetString 之后调用返回。

根据 C 标准(12.2 临时对象),临时对象的生命周期结束于完整表达式的末尾,即 (a) 本身不作为操作数出现在另一个完整表达式中(类对象的构造中除外),并且 (b) 不是 a 的一部分带括号的表达式。

在示例代码中,对 GetString 的调用是完整表达式,并且在该表达式中创建临时 StringBuffer 对象。因此,临时对象的生命周期在 GetString 调用返回后结束。

此生命周期保证确保临时对象保持有效,直到不再需要为止。它允许表达式模板保存对临时对象的引用,因为临时对象将持续到表达式被完全计算为止。

以上是函数调用中何时调用临时 C 对象的析构函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn