预计2次调用析构函数但只获得1次

时间:2012-09-06 11:37:55

标签: c++ destructor

我正在研究函数如何通过返回值返回对象。所以,为了测试这个理论,我运行了一个简单的程序,它有一个返回myclass实例的函数 - 一个定制的类。

#include <iostream>
#include <cstdio>
using namespace std;

class myclass {
    int i;
    public:
    void set_i(int n) { i=n; }
    ~myclass();
};

myclass f(int k); // return object of type myclass

int main()
{
    f(20);
    return 0;
}

myclass f(int k)
{
    myclass x;
    x.set_i(k);
    return x;
}

myclass::~myclass() {
cout << "hello\n";
}

我通过在其中放置一个cout“hello”语句来重载析构函数,以便我能够跟踪函数中对象的本地副本以及在执行return语句期间创建的临时对象何时被销毁。 / p>

所以,我预计会有2次调用析构函数;一个用于函数的对象本地副本,另一个用于临时对象。但相反,我只收到了一个!

请分享为什么我的程序没有两次输出“你好”。

感谢。

1 个答案:

答案 0 :(得分:4)

这是返回值优化的效果,它消除了为保存函数的返回值而创建的临时对象。这样可以优化冗余的复制构造函数和析构函数调用。