为什么连VS调试器外启动的程序都不能调用terminate方法呢



我写了一个非常简单的程序,预计会崩溃,但它会崩溃。现在,我已经设置了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_terminateatexit或任何你计划在控制的终止程序时调用的函数。

使用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();
}

相关内容

最新更新