【C++】外传篇1:异常的深度解剖

问题1:

如果在main函数中抛出异常,结果会怎么样?

include <iostream>

using namespace std;

class Test 
{
public:
    Test() 
    {
        cout << "Test()"; 
        cout << endl;
    }
	
    ~Test() 
    {
        cout << "~Test()"; 
        cout << endl;
    }
};


int main()
{
    static Test t;
    
    throw 1;
	
    return 0;
}

结果是程序异常终止并退出(但是不同编译器环境下结果不同)

terminate() 
{
  // exit(1);
  // abort();
  // ...
}
//这个函数内部还可以做其他事情(解释为什么不同编译器有不同效果)

exit(1)
//确保静态变量 全局对象的被析构。资源要释放

abort()
//等不到资源释放就退出

terminate()函数的替换:

void my_terminate()
{
    cout << "void my_terminate()" << endl;
    exit(1);
    // abort() 默认的情况下是这个函数,这也是设计库的时候考虑的
    
}

class Test 
{
public:
    Test() 
    {
        cout << "Test()"; 
        cout << endl;
    }
	
    ~Test() 
    {
        cout << "~Test()"; 
        cout << endl;
    }
};


int main()
{
    set_terminate(my_terminate);
    
    static Test t;
    
    throw 1;
	
    return 0;
}

程序调用我们自己定义的  my_terminate()  函数.

 

问题2:

析构函数中抛出异常发生什么情况?

 

不允许在析构函数里面扔出异常

1.析构函数是用来释放资源的地方,如果抛出异常,那么资源可能得不到正常的释放。

2.有可能导致全局的函数 terminate() 函数重复的调用,非常可怕,会使系统进入不稳定的状态。

小结:

1.如果异常没有被处理,最后 terminate() 结束整个程序,它是整个程序释放资源的最后机会

2.结束函数可以自定义,但是不能抛出异常

3.析构函数不能抛出异常,可能会导致 terminate() 多次调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值