C++程序闪退原因定位
- 内部直接或者间接调用了terminate函数或者abort函数,terminate函数内部也是默认调用了abort函数。
C++异常处理之terminate函数
C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,
学会使用terminate函数有助于异常处理
一 当一个异常产生的时候调用terminate函数,代码:
[cpp] view plaincopyprint?
- #include <iostream>
- #include <exception>
- using namespace std;
- void on_terminate(){
- cout<<"terninate function called!"<<endl;
- cin.get();
- }
- int main(void){
- set_terminate(on_terminate);
- throw exception();
- cout<<"terminate function not called!"<<endl;
- cin.get();
- return 0;
- }
terminate被调用的情况:
1 当发送一个异常,并且构造函数产生异常
2 当发送一个异常,或者析构函数产生异常
3 一个静态对象的构造或者析构发送一个异常
4 以atexit注册的函数发生异常的时候
5 自定义一个异常,但是实际上没有异常产生的时候
6 调用缺省的unexcepted()函数时候
例子说话:
[cpp] view plaincopyprint?
- #include <iostream>
- #include <exception>
- using namespace std;
- void on_terminate(){
- cout<<"terminate function called!"<<endl;
- cin.get();
- }
- class custom_exception{
- custom_exception(){
- }
- custom_exception(const custom_exception& excep){
- throw exception();
- }
- };
- void case_1(){
- try{
- throw custom_exception();
- }
- catch(...){
- }
- }
当一个函数抛出了一个throw异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。
同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。
[cpp] view plaincopyprint?
- #include<iostream>
- using namespace std;
- class X
- {
- public:
- class Trouble {}; //注意:类中嵌套类的申明和定义,学习!!!
- class small: public Trouble {};
- class big:public Trouble {};//类中的继承!!!
- void f(){
- throw big();
- }
- };
- int main()
- {
- X x;
- try{
- x.f();
- }
- catch(X::Trouble &)
- {
- cout<<"caught Trouble"<<endl;
- }
- catch(X::small&)
- {
- cout<<"caught small"<<endl;
- }
- catch(X::big&)
- {
- cout<<"caught big"<<endl;
- }
- return 0;
- }
如果这样的话,抛出的big()类型异常则被trouble类垄断,应该倒着写才可以实现顺序捕获所有异常,另外使用...可以捕捉所有的异常,这个应该放到最后面才可以。
省略号异常处理器不允许接受任何参数,所以无法得到任何相关异常的信息,也无法知道异常的类型,这种catch语句经常用于清理资源并重新抛出所捕获的异常。
Terminate或者abort结束的程序 , 会在windows事件查看器上面反映出来
C++程序闪退原因定位相关推荐
- android app程序闪退原因分析
1.xml布局不合理,导致程序难以绘制界面,从而闪退,例如:<fragment>中放入<constraint>导致布局不合理 2.activity没有在manifest中申明 ...
- iOS程序闪退的原因以及处理办法
iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...
- 诺基亚java闪退_手机程序闪退怎么办?使用这三种办法,即可轻松搞定
很多朋友在往手机内安装软件时,发现安装完的软件无法正常使用,只要一点击此软件,该程序就会自动退出,也不知道是什么原因导致的,又不知道该如何选择,本期文章就说说解决"手机程序闪退"的 ...
- iphone闪退修复工具_iPhone更新iOS 13出现程序闪退?大家不妨试试这个方法来解决问题...
发布iPhone 11系列以后,关于苹果手机的热度都很高,最近就有很多网友在反馈他们的iPhone手机在更新到iOS 13正式版以后,会有部分APP会出现频繁闪退,无法进入程序的页面. 关于网友说的这 ...
- android 百度地图闪退,Android使用百度地图出现闪退及定位时显示蓝屏问题的解决方法...
使用百度地图出现闪退 一般情况下出现闪退是在AndroidManifest.xml文件中未在application标签中配置 android:name="com.baidu.lbsapi.A ...
- ios 应用闪退原因
iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...
- Android程序闪退解决思路
这几天在做Android程序的实验,完全新手,遇到一些问题,其中最让人头疼的是程序闪退,相信很多人都有点感觉无从下手,特地分享一下我的经验. 首先,做了一个程序,在模拟器上运行,显示 " * ...
- android打包apk进程序闪退,解决安卓打包apk安装后打开闪退的问题
系统版本 Android Studio版本 Build APK方式生成APK 调试的时候好好的,将打完的包传输到手机上进行安装,安装成功,但是一打开就闪退. 没办法,只好通过在命令行运行adb log ...
- 如何应对应用程序闪退、强退的现象
2019独角兽企业重金招聘Python工程师标准>>> 如何应对应用程序闪退.强退的现象 各位机友在使用手机的过程当中肯定都遇到过应用程序闪退或者强制关闭的情况,这个问题让人很困 ...
最新文章
- 解决LoggerFactory is not a Logback LoggerEither remove Logback or the competing implementation (class
- Qt学习笔记之QByteArry
- Android隐式启动匹配:action,category,data
- python给列表的每一项都加上特定的字符串
- 【0x50「动态规划」例题】LCIS【最长公共上升子序列】
- 精仿blbl视频播放器源码 cms播放器 支持加视频LOGO
- JDK集合源码解析剖析
- 技术面试问项目难题如何解决的_技术面试中,遇到不会回答的问题怎么破?
- vue在线引入阿里矢量图标
- Myeclipse 10破解图解
- arrayblockingqueue java_Java ArrayBlockingQueue take()用法及代码示例
- 简单分账系统的分账流程是什么样的?
- dom4j解析xml格式字符串获取标签属性和内容
- 控制图简明原理及Plotly实现控制图Python实践
- STM32 GPS定位
- Linux单网卡双IP
- 在树莓派上使用基于MCP2515的CAN总线模块
- 远程桌面端口修改.bat
- 老闪创业那些事儿(13)——码农雷神的一天
- 【差分约束系统】【最短路】【spfa】CDOJ1646 穷且益坚, 不坠青云之志。