离开作用域(函数)时 释放/析构对象的顺序次序

本文探讨了C++中当离开作用域时,对象析构的顺序。按照从下到上的顺序进行,静态(static)与非静态(non-static)变量的析构时间不同。静态变量不会导致内存泄漏,而是在程序结束时析构。异常处理部分提到,只有在外层catch块捕获异常时,对象才会析构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

离开作用域时 释放/析构对象的顺序次序

离开作用域时, 空间回溯

void func(){
	Obj o1;
	Obj o2;
	
	return/throw; ' 即, 会导致: 离开当前作用域 '
}

当离开当前作用域时, 会从当前退出点 往上回溯, 进行析构
析构的顺序是: ~o2 -> ~o1
即, 越往下 越先析构

非static

Obj o;

int main(){}
  • 1: o的构造函数
  • 2: main函数
  • 3: o的析构

static

static Obj o;

int main(){}
  • 1: o的构造函数
  • 2: main函数
  • 3: o的析构

一定要注意这里, 不要以为, static会泄漏内存!!!

不管是全局域 还是 函数域里的 static, 都不会 泄漏内存!!!
只是一个时机的问题!!! static的变量, 在离开作用域 不会析构, 而是在main函数结束后 才会析构!!!

只有new的内存, 才会泄漏内存!!!

异常

string func(){
	Obj a;
	
	throw 123;
	
	return "abc";
}

todo: (好像, 外部catch( int )到, 才会(~a)); 如果没有捕获异常 则不会析构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值