关于析构函数在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();
   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值