在函数返回的临时对象上调用成员函数是否安全(函数返回后)?

时间:2016-05-26 18:41:15

标签: c++

我不知道当临时对象是由(另一个)函数创建然后返回时,调用临时对象的成员函数是否安全。

以下是一个例子:

string getString(const string &str)
{
    string tempStr = str + str;

    return tempStr;
}

int main()
{
    if(getString("aaaaa").compare("bbbb") == 0) { // is it safe?
        // do something
    }
}

我也会进行终身测试。

class Foo
{
public:
    Foo()
    {
        cout << __PRETTY_FUNCTION__ << " :" << this << endl;
    }

    ~Foo()
    {
        cout << __PRETTY_FUNCTION__ << " :" << this << endl;
    }

    void show()
    {
        cout << this << endl;
    }
};

Foo func(void)
{
    return Foo();
}

int main()
{
   func().show();
   return 0;
}

结果:

Foo :: Foo():0x7fff4d03d3bf
void Foo :: show():0x7fff4d03d3bf
Foo :: ~Foo():0x7fff4d03d3bf

似乎析构函数将在成员函数完成后启动。 但它取决于编译器吗?

PS:我使用的编译器是g ++ v 5.3.1 感谢

1 个答案:

答案 0 :(得分:9)

由按函数返回对象的函数的return语句创建的临时对象至少存在,直到调用该函数的整个语句完成为止。所以这是安全的。

由于返回值优化,您没有看到tempStr被销毁。但是,即使tempStr被销毁,代码仍然是100%安全的,因为您访问的临时不是 tempStr,而是由值返回创建的。