条款8:别让异常逃离析构函数

本文探讨了在C++析构函数中抛出异常的问题,分析了其可能导致的内存泄漏和程序不稳定,提出了两种解决方案:一是使用std::abort()立即终止程序;二是将异常处理的选择权留给用户,避免在析构函数中抛出异常。

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

在析构函数里面抛出异常是不好的:
class Widget{
public:

~Widget(){…}
};
void doSomething()
{
std::vectorv;
… //v这里被自动销毁
}

当v被销毁,里面的widget会被销毁,当第一个widget被销毁时抛出异常,其他的纠葛widget还是应该被销毁,不然容易内存泄漏,当第二个widget销毁时又抛出异常,那么系统无法忍受这么多的异常,程序不是立马结束就是导致不明确行为,所以后面的八个widget可能不会被析构。于是,C++不喜欢析构函数突出异常。

解决办法:
1.当出现异常时,直接使用std::abort()结束程序。

DBConn::~DBConn()
{
try{db.close();}
catch(...)
{
std::abort();
}
}

这样会在不明确情况出现前终止程序,但是这样太过于武断,也不是很好。

2.另一种方法是将选择权抛给用户。

所以当析构函数出现异常,要么吞下他们(不传播)或结束程序,要么就不要在析构函数中吐出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值