空引用如何导致代码0xc0000005的 SEH 异常
How can null reference result in SEH exception with code 0xc0000005?
我正在使用Google C++测试框架编写一些测试代码,但忘记初始化某个对象myObj
。这会导致以下错误。
unknown file: error: SEH exception with code 0xc0000005 thrown in the test body
单步执行相应的代码时,似乎表单的方法调用
myObj->method()
被执行,而 myObj 未初始化,即其值为 0x00000000
。然后在第三方库深处的某个地方抛出此错误。
这怎么可能呢?为什么它不会在调用该方法后立即引发 null 引用异常?
正如注释中正确指出的那样,从未初始化的类指针调用方法是一种未定义的行为,因此任何事情都可能发生,具体取决于编译器实现。但是,很容易预测为什么在您的案例中执行是半成功的。类(__thiscall
(成员和序数函数之间的唯一区别是它们接收额外的隐藏参数,其中包含指向类实例(this
(的指针。Microsoft C++编译器通过寄存器传递this
参数ecx/rcx
,其他编译器可能会使用不同的方法。但是,如果您的类方法没有尝试取消引用无效的指针this
则不会引发异常,并且根据方法逻辑,您的程序甚至可以继续执行而不会出错。如果您尝试调用虚拟方法,情况会大不相同。在这种情况下,您的程序将尝试使用类 vtable
计算正确的方法地址,取消引用无效指针并失败并因访问冲突而失败,即使方法本身未this
使用指针也是如此。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 我可以从Windows SEH异常中解码C 异常吗?(如果是这样,怎么样?)
- Visual studio显示SEH异常的错误位置
- 包含python.h和boost/python.hpp的C++导致SEH异常
- 空引用如何导致代码0xc0000005的 SEH 异常
- 如何从SEH异常生成堆栈跟踪
- 结构化异常处理程序(SEH)不会捕获堆损坏
- 从混合模式c++项目中的CLR-to-SEH异常中获取明智的信息
- 使用googlemock时SEH异常
- 混合c++异常处理和SEH (windows)
- 捕获GUI代码中的SEH异常