mfc socket onreceive函数不被调用_不报错地调用空指针类的成员函数

675925abbd1bdde461d4a590a8f3d8d7.png
​猜猜下列例子运行会有什么结果?
class A
{
public:
    static void print()
    {
        printf(">>>>>n");
    }

    void print2()
    {
        printf("+++++n");
    }

    void print3()
    {
        printf("====%dn", value);
    }

private:
    int value;
};

int main(int argc, char *argv[])
{
    A *a = NULL;
    a->print();
    a->print2();
    a->print3();
    return 0;
}

运行结果:

a->print()  输出:>>>>>
a->print2() 输出:+++++
a->print3() 程序段错误

前两个应该都会段错误才对的呀,怎么都运行正常了。其实上述的行为都由this指针左右结果。

0x00 静态函数没有this指针

静态方法随着类的加载而加载,静态方法不需要实例化。不会引用到this指针里面的数据,所以static void print()不会报错。

0x01 成员函数不使用this指针不报错

a->print();可以近似看作void print(A *a):

void print(A *a)
{
    printf("+++++n");
}

由此A的实例a指针没有被使用,不会访问到错误的地址而出现异常。

0x02 空指针引用实例成员才会异常

void print3()中使用了实例a的value成员,由于a为空,没有指向具体的内存,导致引用value内存出错。

0x03 总结

上述行为引起段错误的原因是空指针实例引用了成员变量导致的。


更多精彩文章请关注微信公众号:「Qt君」

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值