为什么用指针为NULL的类方法调用有效?

时间:2019-03-15 08:48:31

标签: c++ null null-pointer

我一直在寻找一个我从未期望运行的示例代码。

class A
{
public: 
    void show() { cout << "show" << endl; }
};
int main()
{
    std::cout << "Hello World!\n"; 
    A * ptr = NULL;
    ptr->show();
    std::cout << "DONE!!!!!!";
}

我已经声明了一个null指针,它仍在运行并调用show()方法。怎么可能??

3 个答案:

答案 0 :(得分:3)

此处具有未定义的行为,因为您正在取消引用NULL指针。

但是如果它运行并显示“显示”,则可能是因为:

  • 在调用函数NULL之前,编译器不会检查指针是否为show
  • 由于函数show不是virtual,因此无需引用虚拟表来调用它。
  • 该函数不会访问类A中的任何成员变量,因此它不需要取消引用this指针(在这种情况下为NULL)。

答案 1 :(得分:2)

好吧,这当然是所谓的undefined behavior的示例,具体取决于调用的对象类型的功能以及它可能如何影响程序状态。不同的编译器可以用不同的方式处理此问题。对于您的特定情况,最可能的原因是您实际上拥有进行调用所需的东西。指针的类型是已知的,因此该方法的代码也是已知的。该方法不使用this或以其他任何方式尝试更改对象,因此它可以很好地运行代码。

答案 2 :(得分:0)

由于“ show”方法是成员函数,因此将隐式给予对象指针作为参数。由于您的班级没有任何需要访问此指针的成员,并且'show'方法对此不做任何事情-一切正常。您指向对象的隐式指针将被忽略。您也可以这样做:

void show(void *ptr)
{
    std::cout << "wow it works - I wonder why ;-)" << std::endl;
}

并像这样调用它:

show(NULL);

它可以工作,但这并不意味着您应该这样做;-)