Home  >  Q&A  >  body text

C++用空指针调用成员函数是未定义行为吗?

下面的代码:

class A {
public:
    void func(){}
    void func1(){a = 0;}
private:
    int a;
};

int main()
{
    A* a = 0;
    a->func();
    a->func1();
}

我使用vs2008和g++ 4.8.2编译,调用func()不会有问题,调用func1()会出错
但有人说调用func()也会出错(不知道是他确时出错,还是测试代码写的不一样导致出错)

所以我想知道空指针调用成员函数是未定义行为,由编译器决定如何做,还是C++标准有相关规定

高洛峰高洛峰2715 days ago639

reply all(5)I'll reply

  • ringa_lee

    ringa_lee2017-04-17 11:29:04

    成员函数的 this 可以为空指针,只要不在成员函数里面显式/隐式的使用 this 就行。这是因为 C++ 里面 this 其实就是函数的最后一个参数,并没什么特别的,所以没什么 undefined behavior 在这里面。

    这个特性其实没什么特别的用处,我仅仅在某些指针的链式调用里会稍微用一下这个特性。

    比如:

    Foo *foo = ...;
    foo->bar()->play();
    

    barplay 都是返回 Foo * 的函数,那么如果在里面写 if (!this) return nullptr; 就可以方便的实现链式调用而不用检查返回值。

    reply
    0
  • 黄舟

    黄舟2017-04-17 11:29:04

    当然是Undefined behavior,在你以为它没出错的时候,它已经悄悄的联络三体人给了它们发射智子的坐标。
    言归正传,所谓UB,就是说没有人能对这一类行为的后果做出预测并负责,在特定的环境下也许它能正常工作,但对此没有任何保证。

    reply
    0
  • 高洛峰

    高洛峰2017-04-17 11:29:04

    我猜测,只要没用到成员变量,虚函数等需要对象地址的东西,调用那个函数应该不会有问题。。。只是函数调用的时候,this指针的那个寄存器是0而已。。

    reply
    0
  • PHPz

    PHPz2017-04-17 11:29:04

    和平台也有关,linux一定会出错,unix一般没有问题,但不能保证

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:29:04

    楼主我帮你翻译成纯C代码你看下

    struct A{
        int a;
    };
    
    void fun(A* this)
    {
    }
    
    void func1(A* this)
    {
        this->a = 0;  // <--- 这里当然有问题啦
    }
    
    int main()
    {
        A* a = 0;
        fun(a);
        fun1(a);
    }
    

    然后自己理解. 没用到C++的virtual 差不多就是这样子的. 楼上几个如果自己不动就别回答了.

    reply
    0
  • Cancelreply