C++中析构函数为什么不允许抛出异常

【C++中析构函数为什么不允许抛出异常】1.问题本身:
在语法上,C++允许在析构中抛出异常,但异常处理,本身就是为了处理构造失败的情况。
当一个对象构造失败而抛出异常时,我们应当利用析构函数,清理无效对象,并回收其资源,这是使程序健壮的重要手段。
2.问题分析:
从1可知,构造函数显然是可以抛出异常的。
进一步分析,在析构函数中抛出异常,会出现哪些情况:
(1)对象正常结束,在析构时,触发析构函数中的异常,打印异常信息,退出。在这种情况下,抛出异常并没有什么问题,析构函数的异常会被外面捕获;当然,如果外面的程序没有继续释放剩余的资源,可能会造成内存泄露。
(2)对象离开作用域之前,抛出异常,此时会调用析构函数,析构函数再抛出异常,此时之前的异常就不能被捕获了,而且会造成程序crash。
3.问题总结:
那么,是否就不可以在析构函数中使用异常?
答案显然是否,在某些情况下,我们不可避免的要在析构函数中使用异常,使程序依然健壮的关键的关键在于,不要让异常逃离析构函数。可以用try catch吞掉异常。
当然,更好的实践是,就不要在析构函数中使用异常。

    推荐阅读