c++ - 从技术上讲,如何在堆栈跟踪中使 this 指针为空?

标签 c++ segmentation-fault

我有一个核心文件,其中应用程序在 NULL 指针上调用的方法内崩溃:

class myclass{
    myclass_impl* impl;

    void func();
}

func(){impl->implFunc();}

由于成员 impl 为 NULL,应用程序崩溃。但 stracktrace 以 myclass_impl::implFunc() 结尾,*thisNULL

这怎么可能?

最佳答案

因为函数 implFunc() 的位置是已知的。它有一个地址,因此当我们查看调用堆栈时我们知道我们在它内部。

但是,用于调用该函数的 this 指针被设置为 0 (或者实际上是一些未定义但未分配的值 - 取决于它的使用方式)。


您可以将成员方法想象为将隐式第一个参数作为 this 值的函数(事实上,在许多平台上为 exactly what happens)。您不需要指针有效即可调用函数。该调用至少会到达该函数,从而将该函数的位置放在调用堆栈上(这就是用于生成回溯的内容),并且该函数内部发生的情况取决于是否您取消引用该指针。

那么,您的场景意味着您调用该函数时隐式第一个参数是 NULL 指针。函数调用本身成功,但在函数(方法)内部使用的指针失败,因为您取消引用了空指针。

关于c++ - 从技术上讲,如何在堆栈跟踪中使 this 指针为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626945/

相关文章:

C++ 该代码 fstream 有什么问题

c++ - 为什么 std::vector 项目删除不会减少其容量?

c++ - 自定义 QDialog 在 exec() 时导致段错误

C++创建导致段错误的新数组

C - fgets 在使用 char 数组时神秘地导致段错误

c - 结构内部消失后的段错误(变量已损坏)

c - 总线错误和段错误取决于输入的值

c++ - 使用 Win32 执行命令提示符的功能

c++ - `STRSAFE_NO_TRUNCATION` 和 `STRSAFE_NULL_ON_FAILURE` 值有什么区别?

c++ - static_assert 如果表达式是 constexpr