我有一个核心文件,应用程序崩溃在一个在NULL-pointer上调用的方法中:
class myclass{
myclass_impl* impl;
void func();
}
func(){impl->implFunc();}应用程序崩溃,因为成员impl为NULL。但是,在myclass_impl::implFunc()中,串跟踪以*this和NULL结尾。
这怎么可能?
发布于 2015-11-10 09:44:56
因为已知函数implFunc()的位置。它有一个地址,因此当我们查看调用堆栈时,我们知道我们在其中。
但是,用于调用该函数的this指针被设置为0 (或者实际上,一些未定义但未分配的值--取决于它的使用方式)。
您可以想到一些成员方法,比如将一个隐式第一个参数作为this值的函数(实际上,在许多平台上都是exactly what happens )。不需要指针才能调用函数。调用至少会到达函数,从而将函数的位置放置在调用堆栈上(这是用来生成回退跟踪的),而函数内部发生的事情取决于是否取消引用该指针。
因此,您的场景意味着调用该函数时,隐式第一个参数是一个NULL指针。函数调用本身成功,但是函数(方法)中使用的指针失败了,因为您取消了一个空指针。
https://stackoverflow.com/questions/33626945
复制相似问题