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
相关产品推荐
相关产品推荐

