空指针的成员函数调用

指针为NULL了,函数还能调用吗?于是写了一个简单的程序来做测试,代码如下:

class A {
public:
     int i;
     void f()  {
         cout<<"Hello"<<endl;
     }
};


void main() {
     A * p= NULL;
     p->f();
}

    测试发现,程序能够正常运行。把p赋一个非空值如p=(A*)123; 同样如此。于是想搞明白这到底是怎么一回事。虽然以前明白类成员函数中其实是隐藏了一个this指针,但不同的实例在调用函数时是如何工作的,还不是很清楚。通过这个测试,才能我彻底明白。

    对于一个类,在编译好的汇编代码中,只有一份代码拷贝,但是有不同的实例空间。比如我们定义A a,b;我们调用a.f()和b.f()时,会跳转到类代码中f()函数的实现部分。

    但如果你要引用成员变量,比如a.i,那么程序需要找到a在内存中的地址,然后通过便宜量找到成员i的地址。如果f()中加上一句cout<<i<<endl的话,上面的代码很显然会崩溃,为什么呢?

    在函数的汇编代码中,有一个变量this,你在做函数类的函数调用的时候,类似与函数参数一样压到栈上去,虽然不同实例执行了同一段代码,因为this不同,得到的结果当然不同。如果你要存取成员变量,而this是一个非法地址,当然会引起崩溃。

    综上可知,即时一个函数调用正常,还不能确定指针非空,很可能是因为成员函数中没有使用成员变量的缘故。看来,这还真是一个搞笑的bug。

 

--------------------------------------------------------------------------------


这是我自己的一段代码:

int _tmain(int argc, _TCHAR* argv[])
{
    string leftString("test ");
    string rightString("test");
    dstring *praxis = new dstring();   

    praxis->praxis1(leftString, rightString);
    delete praxis;
    praxis = NULL;
   
    cout << praxis->praxis2() <<endl;
   
    system("pause");
    return 0;
}


delete释放了praxis所指向的堆地址中的数据,并且指针被赋为空了, 当调用praxis->praxis2()时,虽然这个时候praxis指针已经空了,但由于Praxis2方法中没有使用成员变量,所以,程序并没有试图去访问堆,也就不会引起error或者将系统搞崩溃。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/AXWolfer/archive/2009/07/22/4370777.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值