首页 >> 电子商务大学 >> 网站建设班 >> NET区
 
关于析构函数在STACK-UNWINDING中扔出异常的代码分析



根据,MECPP 的条款11。开头一段:

在有两种情况下会调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出了作用域或被显式地delete。第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。
    在上述两种情况下,调用析构函数时异常可能处于激活状态也可能没有处于激活状态。遗憾的是没有办法在析构函数内部区分出这两种情况。因此在写析构函数时你必须保守地假设有异常被激活。因为如果在一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用terminate函数。这个函数的作用正如其名字所表示的:它终止你程序的运行,而且是立即终止,甚至连局部对象都没有被释放。

几乎让人很费解,所以写了下面这段code以帮助理解:

#include <iostream>
#include <exception>
using namespace std;

class class_test {
    public:
        class_test(void){}
        ~class_test(void)
        {
            // throw bad_alloc();
            //如果此处扔出异常将会调用terminate()
            cout << "~class_test()....." << endl;
            cin.get();
         }
    private:
};
void funtest0(void)
{
    class_test obj;
    cout << "f0......" << endl;
    throw bad_alloc();
    cout << "funtest0()......" << endl;
}
void funtest1(void)
{
    class_test obj;
    cout << "f1....." << endl;
    funtest0();
    cout << "funtest1()......" << endl;
}      
     
int main()
try
{
    class_test obj;
    funtest1();
    cin.get();
    return 0;
}
catch(bad_alloc &e)
{
    cout << e.what() << endl;
    cin.get();
   
}




1
 
电子商务大学版权与免责声明:

 
凡本网注明“来源:35DX”的所有作品,版权均属于电子商务大学,未经本网授权不得转载、摘编或利用其它方式使用上述作品。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:电子商务大学”。违反上述声明者,本网将追究其相关法律责任。
凡本网注明“来源:XXX(非电子商务大学)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,同时,本站转载并无任何商业目的。
如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行。
联系方式:电子商务大学 webMaster@35dx.com