欢迎光临散文网 会员登陆 & 注册

Effective C++ 第八条Prevent exception from leaving destructors.

2023-01-11 19:33 作者:九思519  | 我要投稿

别让异常逃离析构函数

        C++不禁止析构函数抛出异常但是也不提倡这样的做法,因为有可能原本析构函数承担了释放内存的任务,而异常可能导致析构函数没执行完就程序结束了,从而内存泄漏。以下有个例子

        假设 v 中有2个 Wiget,其中2个Wiget都在析构的时候抛出异常,此时程序不是结束执行就是导致不明确行为,会在释放 v 之前而程序提前结束,导致内存没有释放。

        方式一采取的方法是遭遇错误就停止执行程序,此行为较为合理,也就是阻止不明确行为发生。

        方法二采取的是吞下因调用close而发生的异常,这种行为一般是不好的,因为导致错误信息无法立马显示。但是有时候比如“草率结束程序”和“发生不明确行为”来说要好。

一个较好的解决方法

        如果实在需要在析构函数中使用异常,那么可以通过给客户留接口来实现,就是析构函数本身释放一次,又显式的给客户留出一个释放接口,在程序抛出异常的时候控制离开析构函数也能让客户来释放资源。

        此类问题复杂的时候很难依靠程序员独自处理,因为情况和问题多种多样,需要客户和开发者一起解决。留出一个接口给客户也不失为一种补救方法。

Effective C++ 第八条Prevent exception from leaving destructors.的评论 (共 条)

分享到微博请遵守国家法律