通过一个非法的指针或者NULL指针调用成员函数会发生什么?
通过一个非法的指针或者NULL指针调用成员函数会发生什么?
#include <iostream>
struct foo
{
void bar () { std :: cout << "gman was here" << std :: endl ; }
void baz () { x = 5 ; }
int x ;
};
int main ()
{
foo * f = 0 ;
f -> bar (); // (a)
f -> baz (); // (b)
}
我们预计b会崩溃,因为对于NULL POINTER(空指针)没有相应的成员数据x。
而在实践中,(a)不会crash,因为没有用到this指针。
(b)会提领this指针,((*this).x=5;),但是this为NULL,所以程序行为未定义。
那么(a)是否也是未定义了?
对于E1->E2而言,这个表达式会变成(*(E1)).E2,那么此时也会对NULL POINTER进行提领,所以(a)的行为
也是未定义的。
但如果E2是一个static函数,那么*(E1)会被忽略,所以不会表现出UB。
@IS2120#CNBLOGS.T2169364049[T1,L65,R1,V259]:备忘
$ € ₤ ₭ ₪ ₩ ₮ ₦ ₱ ฿ ₡ ₫ ﷼ ¥ ﷼ ₫ ₡ ฿ ₱ ₦ ₮ ₩ ₪ ₭ ₤ € $