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 ;}

3. C++ terminate()函数相关推荐

  1. python多进程之进程的terminate() 函数

    python多进程之进程的terminate() 函数 terminate() 函数 是用来杀死子进程的 举例如下: from multiprocessing import Process impor ...

  2. C++异常处理之terminate函数

    C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理.如此逐级上传,直到最高一级 ...

  3. 学习用于异常处理的terminate()函数

    <script type="text/javascript"> google_ad_client = "pub-8800625213955058"; ...

  4. java terminate_学习Java用于异常处理的terminate()函数

    异常处理是一个微妙的问题,你应该尽可能优雅地处理所有异常.要达到这个目的,你需要学习terminate()函数. terminate()函数在程序抛出一个异常并且异常没有被捕获的时候被调用,像下面这样 ...

  5. 【C++】 外传篇 2_函数的异常规格说明

    函数的异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++ 提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 /** 可能抛出任何异常 */ ...

  6. c++ 多线程 类成员函数_多线程(C++/Python)

    多线程(C++/Python) 本文包括一下内容: 通过C++11的标准库进行多线程编程,包括线程的创建/退出,线程管理,线程之间的通信和资源管理,以及最常见的互斥锁,另外对python下多线程的实现 ...

  7. trap_exit与terminate

    今天写代码的发现,关闭app的时候,监控树下的某个进程terminate函数没执行,所以有以下备忘记录 1 erlang:process_flag(trap_exit,true). When trap ...

  8. python 结束进程 terminate_【Python】multiprocessing.Process.terminate()结束子进程将导致子进程无法执行finally块,如何解决?...

    我在使用multiprocessing库创建进程的时候,发现了这么一个问题: https://docs.python.org/3.5/library/multiprocessing.html#mult ...

  9. C和C++安全编码笔记:动态内存管理

    4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...

最新文章

  1. 腾讯云TDSQL-A发布公有云版本 支持第七次全国人口普查等海量数据场景
  2. Android——四大组件、六大布局、五大存储
  3. apt-get卸载命令
  4. 数据可视化【十四】交互式过滤地区分布图
  5. Installation error: INSTALL_FAILED_UID_CHANGED
  6. 欧菲光修正2020年业绩为预计亏损18.5亿元
  7. rtsp直接转http fmp4
  8. hive udaf_Hive UDAF 函数的编写
  9. 分享一个串口调试工具
  10. finalshell文件列表不显示_软网推荐:文件变动我知晓
  11. ASP.NET服务器对于请求的处理过程
  12. Python运行效率低的原因
  13. 深入浅出DDR系列(二)--DDR工作原理
  14. 百度API---详解
  15. 击穿面试官的套路:经典面试问题剖析
  16. vivado快捷键设置 放大代码_【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键...
  17. HDU 3085 Nightmare Ⅱ【BFS +曼哈顿距离+综合性较强】
  18. SQL语句的约束 总结
  19. 在使用uglify是出现:.pipe(uglify()) SyntaxError:Unexpected token .
  20. Java匿名内部类方法调用

热门文章

  1. GoDaddy到底是一家什么公司?
  2. Java并发(2)- synchronized与CAS
  3. 庞果网 英雄会 最小公倍数
  4. Oracle的同义词(synonyms)
  5. python标准库random的方法randint_Python标准库Random
  6. 高能剧透:《2022龙蜥社区全景白皮书》即将上线
  7. 程序员卖日本糖果的故事
  8. 使用python flask实现写接口供别人调动,并把flask项目部署在Linux服务器上
  9. java毕业设计选题方向_一份java方向毕业设计题目分享学习_东哥毕设
  10. 【gitbook电子书最新教程】