为什么临时生命周期在扩展过程中,会导致同一个对象被多次调用其析构函数?

2026-04-16 18:342阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计301个文字,预计阅读时间需要2分钟。

为什么临时生命周期在扩展过程中,会导致同一个对象被多次调用其析构函数?

请考虑以下伪代码片段:

function calculateSum(numbers): sum=0 for number in numbers: sum=sum + number return sum

请考虑以下代码段:

#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

本文共计301个文字,预计阅读时间需要2分钟。

为什么临时生命周期在扩展过程中,会导致同一个对象被多次调用其析构函数?

请考虑以下伪代码片段:

function calculateSum(numbers): sum=0 for number in numbers: sum=sum + number return sum

请考虑以下代码段:

#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