Linux下能捕获c++空指针异常吗

Linux下能捕获c++空指针异常吗,第1张

#include <exception>

#include <iostream>

using namespace std

/**********************************

//project ->Properties ->C/C++ ->Code Generation -->Enable C++ Exceptions

//选择 Yes with SEH Exceptions (/EHa) 这样的话C++的try catch 也可以捕获到空指针,内存越界,0除异常

//默认是选择Yes (/EHsc)

**********************************/

void TestIntType()

{

try

{

throw 1

}

catch(...)

{

cout<<"在 try block 中, 准备抛出一个异常." <<endl

}

}

void TestDoubleType()

{

try

{

throw 0.5

}

catch(...)

{

cout<<"在 try block 中, 准备抛出一个异常." <<endl

}

}

void TestEmptyPointType()

{

try

{

int* p = NULL

*p = 3

}

catch(...)

{

cout<<"非法地址 *** 作异常" <<endl

}

}

void TestDivZeroType()

{

try

{

int b = 0

int a = 3/b

}

catch(...)

{

cout<<"0除异常" <<endl

}

}

void TestMemoryOutType()

{

int * a = new int[4]

try

{

for (int i = 0i<245i++)

{

a++

}

*a = 3

}

catch(...)

{

cout<<"内存越界异常" <<endl

}

}

int main(int argc, char* argv[])

{

TestEmptyPointType()

//TestDivZeroType()

TestMemoryOutType()

return 1

}

有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源。c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理。这里总结一下这些情况,如何获取一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用。

这个例子里面其实是将异常退出处理和正常退出处理结合起来了。对于SIGTERM(即kill进程)和SIGINT(即ctrl-c结束前台进程),我们当做是正常退出,在其信号处理函数里面,直接调用了exit(0),而exit(0)又会被server_on_exit捕获到。对于异常退出也是类似,只是调用了exit(-1)表示是异常的。同时异常退出我们会打印出当前的进程堆栈信息,server_backtrace的实现下一篇再说。另外注意的是SIGKILL信号是无法捕获的。而调用abort导致的退出,也是通过SIGABRT信号捕获到进行处理了。其他几种异常退出的信号也是比较常见,一并捕获到进行处理。这样对于异常退出,我们即可统一的log堆栈信息,又可直接继续正常退出时的处理流程了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8359040.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存