相当于 Windows/MSVC 上的段错误?
Posted
技术标签:
【中文标题】相当于 Windows/MSVC 上的段错误?【英文标题】:Equivalent of segfault on Windows/MSVC? 【发布时间】:2019-10-17 23:20:58 【问题描述】:在 Linux 上,以下代码:
long* p = (long*)reinterpret_cast<void*>(0x634963963496034) // random memory address
std::cout << *p;
可能会导致读取尚未分配的内存,并且程序将引发 SIGSEGV 信号。否则称为段错误。 (可以通过sigaction(2)
附加操作)。
Windows/MSVC 上是否有等效机制?
以上代码在 Windows 上会做什么?有什么办法可以捕获这种内存访问冲突,并运行用户提供的函数?
【问题讨论】:
https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019 【参考方案1】:在 Windows 上,当使用 Structured Exception Handling 捕获异常时,宏 GetExceptionCode() 将返回 EXCEPTION_ACCESS_VIOLATION
。
还可以使用 C++ 异常处理来捕获 SEH 异常,如 here 所述。
【讨论】:
【参考方案2】:我正在寻找的是SetUnhandledExceptionFilter
。对于此用例,Windows 上的 SetUnhandledExceptionFilter
等效于 Linux 上的 sigaction
。
【讨论】:
以上是关于相当于 Windows/MSVC 上的段错误?的主要内容,如果未能解决你的问题,请参考以下文章