搜尋

首頁  >  問答  >  主體

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++标准有相关规定

高洛峰高洛峰2839 天前729

全部回覆(5)我來回復

  • 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; 就可以方便的實作鍊式呼叫而不用檢查回傳值。

    回覆
    0
  • 黄舟

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

    當然是Undefined behavior,在你以為它沒出錯的時候,它已經悄悄的聯絡三體人給了它們發射智子的座標。
    言歸正傳,所謂UB,就是說沒有人能對這一類行為的後果做出預測並負責,在特定的環境下也許它能正常工作,但對此沒有任何保證。

    回覆
    0
  • 高洛峰

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

    我猜測,只要沒用到成員變量,虛函數等需要物件位址的東西,呼叫那個函數應該不會有問題。 。 。只是函數呼叫的時候,this指標的那個暫存器是0而已。 。

    回覆
    0
  • PHPz

    PHPz2017-04-17 11:29:04

    和平台也有關,linux一定會出錯,unix一般沒問題,但不能保證

    回覆
    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 差不多就是這樣子的. 樓上幾個如果自己不動就別回答了.

    回覆
    0
  • 取消回覆