通过一个非法的指针或者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。
posted @ 2011-04-21 01:36  BiG5  阅读(176)  评论(0编辑  收藏  举报