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

C++析构函数调用疑问:为何出现三次“Freeing”输出?

析构函数三次调用的原因拆解

嘿,刚学C++类的时候搞不清析构函数的调用时机太正常了,我来帮你理清楚这三次“Freeing”的由来~

首先,根据你的描述,你写的代码大概率是类似这样的(毕竟三次调用的场景很典型):

#include <iostream>
using namespace std;

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

// 假设你的neg函数是返回dyna对象的版本
dyna neg(dyna ob) {
    // 这里做一些逻辑处理
    return ob;
}

int main() {
    dyna obj; // 原始对象
    neg(obj);
    return 0;
}

接下来咱们逐个分析三次“Freeing”的触发时机:

  • 第一次调用:你已经理解啦——neg函数的参数ob是通过值传递创建的原始对象obj的副本,当neg函数执行完毕退出自己的作用域时,这个副本对象会被销毁,触发析构函数,输出第一次“Freeing”。
  • 第二次调用:因为neg函数返回了一个dyna对象,函数返回时会生成一个临时对象来承载这个返回值(除非编译器开启了返回值优化RVO,会跳过这个临时对象,但默认情况下这个临时对象是存在的)。当这个临时对象的生命周期结束(也就是neg(obj)这个表达式执行完之后),它会被销毁,触发第二次析构,输出“Freeing”。
  • 第三次调用:main函数里创建的原始对象obj,当main函数执行完毕、程序即将退出时,这个对象会被销毁,触发第三次析构函数调用,输出最后一次“Freeing”。

如果你的代码和我假设的略有不同(比如neg没有返回对象,但main里创建了两个对象,或者用了临时对象作为参数),核心逻辑也是一样的——每一次“Freeing”都对应一个dyna对象的生命周期结束:要么是函数内的局部对象、要么是临时对象、要么是全局/main函数里的对象。

内容的提问来源于stack exchange,提问作者Arif Hamim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:54:58