考虑以下片段:
#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 个临时对象)。这看起来很奇怪,因为 1) GetTemp()
返回的临时变量应该将它的生命周期延长到完整的表达式,并且 2) 因为我们返回 temp
直接在TakeTemp
, 返回值优化将重用同一个对象。
谁能解释为什么这里有多个 dstor 调用?
(请注意,如果我们放置更多的 TakeTemp() 层,dstor 调用的数量会按比例增长。)
最佳答案
您的函数 TakeTemp
按值获取其参数,并按值返回参数。
您正在那里制作拷贝,因此现在有两个 Temp
对象要删除。
您看到的两个被破坏的对象是此处调用的两个函数的返回值:
TakeTemp(GetTemp());
^ returns a Temp
^ returns a Temp
关于c++ - 为什么临时延长生命周期会导致多次调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54456282/