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

rse*_*thc 4 c++ try-catch access-violation

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

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

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

zak*_*ter 10

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

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

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

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


rus*_*tyx 5

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

MSVC 是,但 SEH 例外 (/EHa)

现场演示

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

输出:

Exception!
Run Code Online (Sandbox Code Playgroud)

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