1、概述
之前整理了一些构造和析构函数的内容,还有一些使用上的细节没有整理,今天就对这些进行一些整理。过年之后就没怎么整理知识,是因为最近在准备换工作,忙着写简历、面试和梳理之前学习的知识。以后会减少知识整理的频率,但是还是会坚持整理的。
2、不让异常逃离析构函数
C++并不禁止析构函数吐出异常,但是它并不鼓励你这样做。这样是有理由的,如下:
class Widget
{
public:
....
~Widget(){...} //假设这里可能会吐出一个异常
};
void DoSometing()
{
std::vector<Widget> v;
.... //v在这里被自动销毁
}
当vector v被销毁时,它由责任销毁其内含的所有Widgets。假设v内含10个Widgets,而在析构第一个元素期间,有个异常被抛出。其他9个Widgets还是应该被销毁,否则它们保存的任何资源会发生泄漏,因此v应该调用它们各个析构函数。
但假设在那些调用期间,第二个Widget析构函数又抛出了异常。现在有两个同时作用的异常,这对C++而言太多了。在两个异常同时存在的情况下,程序若不是结束执行就是导致不明确行为。本例中它会导致不明确行为。
但是如果你的析构函数必须执行一个动作,而该动作可能会抛出异常,我们该怎么办呢?有两个办法:
- 析构函数中捕捉任何异常,然后吞下他们&#