在技​​术上如何在strack跟踪中使用null指针?

时间:2015-11-10 09:41:21

标签: c++ segmentation-fault

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

class myclass{
    myclass_impl* impl;

    void func();
}

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

由于成员impl为NULL,应用程序崩溃。但是,在myclass_impl::implFunc() *thisNULL proc sql; create table Applications as select t1.ApplicantID , t1.ApplicationDate , t2.Segment from Applicants as t1 inner join Segmentation as t2 ON t1.ApplicantID = t2.ApplicantID where t1.ApplicantID ^= '' AND (t1.TR_flag = '') AND (t1.TL_flag = '') AND (t1.RU_flag = '') AND (t1.RP_flag = '') AND (t2.OP_flag = '') AND (t2.OU_flag = '') AND (t2.GG_flag = '') AND (t2.GK_flag = '') order by t1.ApplicantID ; quit; 结束时,stracktrace结束。

这怎么可能?

1 个答案:

答案 0 :(得分:4)

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

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

您可以将成员方法视为将隐式第一个参数作为this值的函数(事实上,在许多平台上都是exactly what happens)。您不需要需要指针才能调用函数。调用将至少到达函数,从而将函数的位置放在调用堆栈上(这是用于生成回溯的内容),以及内部中发生的事情该函数取决于是否你取消引用那个指针。

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