我有一个核心文件,其中应用程序在 NULL
指针上调用的方法内崩溃:
class myclass{
myclass_impl* impl;
void func();
}
func(){impl->implFunc();}
由于成员 impl 为 NULL,应用程序崩溃。但 stracktrace 以 myclass_impl::implFunc()
结尾,*this
为 NULL
。
这怎么可能?
最佳答案
因为函数 implFunc()
的位置是已知的。它有一个地址,因此当我们查看调用堆栈时我们知道我们在它内部。
但是,用于调用该函数的 this
指针被设置为 0
(或者实际上是一些未定义但未分配的值 - 取决于它的使用方式)。
您可以将成员方法想象为将隐式第一个参数作为 this
值的函数(事实上,在许多平台上为 exactly what happens)。您不需要指针有效即可调用函数。该调用至少会到达该函数,从而将该函数的位置放在调用堆栈上(这就是用于生成回溯的内容),并且该函数内部发生的情况取决于是否您取消引用该指针。
那么,您的场景意味着您调用该函数时隐式第一个参数是 NULL
指针。函数调用本身成功,但在函数(方法)内部使用的指针失败,因为您取消引用了空指针。
关于c++ - 从技术上讲,如何在堆栈跟踪中使 this 指针为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626945/