我写了一个非常简单的程序,预计会崩溃,但它会崩溃。现在,我已经设置了terminate函数,但它不会被调用,如果不调用这个函数,程序就会崩溃。
我在调试器内部/外部都有测试程序,以调试/发布模式构建,但显示出相同的行为(至少没有调用我的终止函数)。我正在思考VS 2012和Windows 10。
void func()
{
cout<<"Aah you threw exception"<<endl;
}
int main(int argc, char* argv[])
{
set_terminate(func); //setting terminate function
int *p = NULL;
*p =11;
cout<<*p; //this will throw exception
}
C++不是Java!信号(或trap)可以通过取消引用nullptr来生成,但在C++异常中不会自动转换。在符合POSIX的系统上,您可以尝试使用signal
函数来捕获Throwaway Account 300 Million提出的信号。在Windows上,您可以尝试使用C结构的异常处理。
如果你不这样做,并且仍然生成这样的陷阱,标准只是将其定义为未定义的行为,它通常只是立即中止程序,绕过任何set_terminate
、atexit
或任何你计划在控制的终止程序时调用的函数。
使用signal
捕获分段错误:
#include <iostream>
#include <signal.h>
using namespace std;
void func(int signal) {
cerr << "Caught signal " << signal << endl;
}
int main() {
signal(SIGSEGV, func);
void (*p)() = NULL;
p();
}