加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么临时生命周期扩展会导致多次调用析构函数?

发布时间:2020-12-16 09:22:43 所属栏目:百科 来源:网络整理
导读:请考虑以下代码段: #include iostreamusing namespace std;class Temp { public: Temp() { cout "Temp()" endl;} ~Temp() { cout "~Temp()" endl;}};Temp GetTemp() { cout "GetTemp" endl; return Temp();}Temp TakeTemp(Temp temp) { cout "TakeTemp" end
请考虑以下代码段:

#include <iostream>

using namespace std;

class Temp {
    public:
    Temp() { cout << "Temp()" << endl;}
    ~Temp() { cout << "~Temp()" << endl;}
};

Temp GetTemp() {
     cout << "GetTemp" << endl;
    return Temp();
}

Temp TakeTemp(Temp temp) {
    cout << "TakeTemp" << endl;
    return temp;
}


int main()
{
    TakeTemp(GetTemp());

    return 0;
}

当我运行TakeTemp(GetTemp());时,输出看起来像

GetTemp                                                                                                                                                        
Temp()                                                                                                                                                         
TakeTemp                                                                                                                                                       
~Temp()                                                                                                                                                        
~Temp()

注意,在这里调用~Temp()两次(但是只构造了1个temp obj).这似乎很奇怪,因为1)GetTemp()返回的临时变量应该将其生命周期扩展到完整表达式,并且2)因为我们直接在TakeTemp中返回temp,返回值optmization将重用相同的对象.

任何人都可以解释为什么这里有多个dstor调用?

(注意,如果我们放置更多层的TakeTemp(),dstor调用的数量会按比例增长.)

解决方法

您的函数TakeTemp按值获取其参数,并按值返回参数.

你在那里制作副本,因此现在有两个Temp对象要删除.

您看到的两个被破坏的对象是这里调用的两个函数的返回值:

TakeTemp(GetTemp());
         ^ returns a Temp
^ returns a Temp

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读