6

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

例如,如果出现问题并且程序试图访问它不应该访问的东西,您将如何收到一条错误消息显示“内存访问冲突!” 而不是仅仅终止进程而不向用户显示有关崩溃的任何信息?

我正在使用 MinGW 为 Windows 编写游戏,如果有帮助的话。

4

2 回答 2

11

Access violation是硬件异常,不能被标准捕获try...catch

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

在 Unix/Linux 上,您可以使用 aSignalHandler来捕获SIGSEGV信号

在 Windows 上,您可以使用语句捕获这些结构化异常__try/__except

于 2013-05-17T15:15:45.373 回答
4

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

MSVC 是,但 SEH 例外 (/EHa)

现场演示

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

输出:

Exception!

唯一的缺点是你无法知道出了什么问题。要了解有关异常的更多信息,您可以使用_set_se_translator设置自定义 SEH 翻译函数,如本文所示

于 2017-02-22T11:12:12.367 回答