我一直在寻找一个我从未期望运行的示例代码。
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()方法。怎么可能??
答案 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);
它可以工作,但这并不意味着您应该这样做;-)