函数调用内部创建的对象的生命周期问题咨询
对象生命周期与函数内临时对象的困惑
我一直搞不太清楚对象生命周期和作用域的关系,尤其是在函数内部创建对象返回的时候,总觉得有点模糊。就拿这段代码来说:
#include <iostream> #include <string> using namespace std; struct ins { ins() : _num(++num) { cout << "ctor " << _num << endl; } ~ins() { cout << "dtor " << _num << endl; } int get() { return _num; } static int num; int _num; }; int ins::num = 0; ins geti() { return {}; }
我来给你拆解这里的核心逻辑:
- 调用
geti()时,return {}会创建一个临时的ins对象。这个临时对象的生命周期并不局限在geti()的函数作用域里,C++标准对它有特殊处理。 - 如果这个临时对象用来初始化一个变量(比如
ins obj = geti();),它的生命周期会被延长到这个变量的作用域结束;如果没有绑定到任何变量(比如直接调用geti();),它会在当前完整表达式执行完毕后立即销毁。
举两个实际调用的例子:
- 保存返回值的情况
int main() { ins obj = geti(); return 0; }
如果编译器开启了返回值优化(RVO),会直接在main函数的obj内存位置构造对象,不会产生临时对象,所以只会看到一次构造和一次析构;如果关闭优化,会先构造临时对象,拷贝给obj后销毁临时对象,最后obj在main结束时析构。
- 不保存返回值的情况
int main() { geti(); return 0; }
临时对象会在geti()调用的表达式结束后立即销毁,所以会先打印ctor 1,紧接着就打印dtor 1。
总结一下:函数内创建的返回值临时对象,不会像普通局部变量一样在函数结束时就销毁,而是会根据使用场景“存活”到合适的时机,这就是它和普通局部对象生命周期的关键区别。
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

