我有一个核心文件,其中应用程序在NULL
上调用的方法内崩溃 - 指针:
class myclass{
myclass_impl* impl;
void func();
}
func(){impl->implFunc();}
由于成员impl为NULL,应用程序崩溃。但是,在myclass_impl::implFunc()
*this
与NULL
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结束。
这怎么可能?
答案 0 :(得分:4)
因为函数implFunc()
的位置是已知的。它有一个地址,因此我们知道当我们查看调用堆栈时我们就在其中。
但是,用于调用该函数的this
指针设置为0
(或者实际上,某些未定义但未分配的值 - 取决于它的使用方式)。
您可以将成员方法视为将隐式第一个参数作为this
值的函数(事实上,在许多平台上都是exactly what happens)。您不需要需要指针才能调用函数。调用将至少到达函数,从而将函数的位置放在调用堆栈上(这是用于生成回溯的内容),以及内部中发生的事情该函数取决于是否你取消引用那个指针。
然后,您的方案意味着您使用隐式第一个参数NULL
指针调用该函数。函数调用本身成功,但是内部函数(方法)使用的指针失败,因为你取消引用了一个空指针。