关于构造函数析构函数和异常的一点点

关于程序异常崩溃的事情,我们可以通过捕获异常,还有的通过例如breakpad等来进行crash后的分析处理。但是还是顺带看一下基本的一些东西,避免一些事情。查了一些资料http://www.cnblogs.com/fly1988happy/archive/2012/04/11/2442765.html:

        c++中,如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源, 这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构函数已经变成了异常处理的一部分。但是如果没有捕获到异常,那么程序崩溃,将不会释放资源,new出的空间将会被搁置,也不会给系统接管。

所以一般我们需要尽量去捕获异常,并予以适当的处理,但是有几点要注意:

         第一是,构造函数中抛出异常,会导致析构函数不能被调用,因为对象还未构建,但对象本身已申请到的内存资源会被系统释放(已申请到资源的内部成员变量会被系统依次逆序调用其析构函数),但是此时析构函数里的资源问题由于没有执行就需要注意一下。

         第二是,在析构函数中。通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,由谁来保证这个对象资源释放以及新出现的异常由谁来处理会有这些问题存在,还会造成程序崩溃的问题。而且就还有如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。所以c++标准是不应该在析构函数中,发生异常的。如果实在无法保证,那么至少需要吧异常捕获,try/catch在析构函数里全部解决,不抛到外部。程序有很多的不明崩溃,没有迹象,有些就是由于析构的异常抛出引起的。

你可能感兴趣的:(c++,基础)