You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数调用内部创建的对象的生命周期问题咨询

对象生命周期与函数内临时对象的困惑

我一直搞不太清楚对象生命周期和作用域的关系,尤其是在函数内部创建对象返回的时候,总觉得有点模糊。就拿这段代码来说:

#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();),它会在当前完整表达式执行完毕后立即销毁。

举两个实际调用的例子:

  1. 保存返回值的情况
int main() {
    ins obj = geti();
    return 0;
}

如果编译器开启了返回值优化(RVO),会直接在main函数的obj内存位置构造对象,不会产生临时对象,所以只会看到一次构造和一次析构;如果关闭优化,会先构造临时对象,拷贝给obj后销毁临时对象,最后obj在main结束时析构。

  1. 不保存返回值的情况
int main() {
    geti();
    return 0;
}

临时对象会在geti()调用的表达式结束后立即销毁,所以会先打印ctor 1,紧接着就打印dtor 1。

总结一下:函数内创建的返回值临时对象,不会像普通局部变量一样在函数结束时就销毁,而是会根据使用场景“存活”到合适的时机,这就是它和普通局部对象生命周期的关键区别。

内容的提问来源于stack exchange,提问作者Lorah Attkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:52:01