在C ++中捕获内存访问冲突

时间:2013-05-17 15:10:49

标签: c++ try-catch access-violation

在C ++中,是否有一种标准方式(或其他任何方式)来捕获由内存访问冲突触发的异常?

例如,如果出现问题并且程序试图访问不应该访问的内容,那么如何显示错误消息“内存访问违规!”而不只是终止进程而不向用户显示有关崩溃的任何信息?

我正在使用MinGW为Windows编写游戏,如果这对任何人都有帮助的话。

2 个答案:

答案 0 :(得分:10)

Access violation是硬件异常,无法通过标准try...catch捕获。

由于硬件异常的处理是特定于系统的,因此在代码中捕获它的任何解决方案也都是系统特定的。

在Unix / Linux上,您可以使用SignalHandler来捕获SIGSEGV signal

在Windows上,您可以使用structured exception抓住这些__try/__except statement

答案 1 :(得分:2)

这对您没有多大帮助,但是如果您编译,则可以使用try ... catch(...)在MSVC 中捕获访问冲突和其他SEH异常 /EHa

MSVC Yes with SEH exceptions (/EHa)

<强> Live demo

#include <iostream>
int main() {
  try {
    *(int*)0 = 0;
  }
  catch (...) {
    std::cerr << "Exception!\n";
  }
}

输出:

Exception!

唯一的缺点是你无法知道出了什么问题。要了解有关例外的更多信息,您可以使用_set_se_translator中的this article设置自定义SEH翻译器功能。