为什么连VS调试器外启动的程序都不能调用terminate方法呢
Why not able to call terminate method even program launched outside VS debugger?
我写了一个非常简单的程序,预计会崩溃,但它会崩溃。现在,我已经设置了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();
}
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 不能调用构造函数
- 为什么我不能调用 onFire();
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- Fortran 和 C++ 的混合编程:Fortran 不能调用C++子程序
- 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?
- 返回类型为struct的函数每次调用时都不返回任何内容
- CMake 子项目不能调用 OpenGL 函数,但父项目可以
- 为什么在 2019 年我们仍然不能使用 ctypes 从 Python 调用C++?
- 为什么我们需要在 Visitor 模式中 accept(),为什么我们不能直接调用 visitor.visit()?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 为什么我不能在未链接的 DLL 上调用方法,但可以这样做?C++
- 需要调用gtk_init函数,但不能来自主函数-C
- 为什么 gcc 不能去虚拟化这个函数调用?
- 为什么所有函数<cstring>都不能有 constexpr?
- 方便的标志处理,所有标志都不能放入64位
- 为什么连VS调试器外启动的程序都不能调用terminate方法呢
- Visual Studio 2003在调试模式和发布模式下都不能使用pdb文件
- 为什么在c++ 11中所有的迭代器/迭代器适配器都不能移动?
- c++调用函数不能成功调用函数