3. C++ terminate()函数

1.terminate()函数

C++中,异常不可以忽略,当异常找不到匹配的catch字句时,会调用系统的库函数terminate()(在头文件中)。terminate()函数在程序抛出一个异常并且异常没有被捕捉的时候被调用.
默认情况下,terminate()函数调用标准C库函数abort()使程序终止而退出。当调用abort函数时,程序不会调用正常的终止函数,也就是说,全局对象和静态对象的析构函数不会执行。

如果在 main 函数中抛出异常,不处理,则崩溃;如果异常不处理,最后会传到哪里?
在这里插入图片描述
下面的代码输出什么?
在这里插入图片描述
异常的最终处理编程:

#include <iostream>
 
 using namespace std;
 
 class Test
 {
 public:
     Test()
     {
         cout << "Test()";
         cout << endl;
     }
 
     ~Test()
     {
         cout << "~Test()";
         cout << endl;
     }
 };
 
 int main()
 {
     static Test t;  // BCC Test();
                 // VC 2010 Test();
                 // G++ Test();
 
     throw ;  // BCC Abnormal program termination;
               // VC 对话框弹出来;
               // G++ terminate called after throwing an instance of 'int';
 
     return ;
 }

main() 函数中抛出的异常也许会被一个最终的函数处理,
异常无法被处理的情况:
如果异常无法被处理,terminate() 结束函数会被自动调用;
默认情况下,terminate() 调用库函数 abort() 终止程序;

2.set_terminate()函数

通过使用标准的set_terminate()函数,可以设置自己的terminate()函数。自定义的terminate()函数不能有参数,而且返回值类型为void。另外,terminate函数不能返回也不能抛出异常,它必须终止程序。如果terminate函数被调用,这就意味着问题已经无法解决了。

  1. 参数类型为 void(*)();
  2. 函数指针,没有参数、没有返回值;
  3. 返回值为默认的 terminate() 函数入口地址;

例如:

#include <iostream>
 #include <cstdlib>
 #include <exception>  // C++ 标准库中与异常相关的头文件;
 
 using namespace std;
 
 void my_terminate()
 {
     cout << "void my_terminate()" << endl;
     exit();  // 结束当前的程序;可以确保所有的全局对象和静态局部对象全部都正常析构;
     // abort();  // “已放弃”是这个函数打印出来的,这个函数是异常终止一个程序,并且异常终止的时候不会调用任何对象的析构函数;
 }
 
 class Test
 {
 public:
     Test()
     {
         cout << "Test()";
         cout << endl;
     }
 
     ~Test()
     {
         cout << "~Test()";
         cout << endl;
     }
 };
 
 int main()
 {
     set_terminate(my_terminate);
 
     static Test t;  
 
     throw ;  
 
     return ;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值