当我在空对象指针上调用一个成员函数时会发生什么?

当我在空对象指针上调用一个成员函数时会发生什么?

我在面试中被问到以下几个问题:

class A{public:
    void fun()
    {
        std::cout << "fun" << std::endl;
    }};A* a = NULL;a->fun();

当执行这些代码时会发生什么,为什么呢?


另见:


阿晨1998
浏览 607回答 3
3回答

皈依舞

这是一种未定义的行为,所以任何事情都有可能发生。一个可能的结果就是它只是打印"fun"由于该方法不访问对象的任何成员变量,因此它被调用(据推测对象所在的内存不需要被访问,因此不一定会发生访问冲突)。

幕布斯7119047

按照标准,这是一种未定义的行为,因此是一件非常糟糕的事情。实际上,大多数编程平台(包括X86和其他几个体系结构)都会运行良好。为什么?考虑类函数是如何在C+中实现的。这不是一个虚拟函数,因此这可以是对一个已知地址的静态调用。在x86程序集中,我们可以看到mov A, 0mov ecx, Acall a__fun由于_FIN不需要实例数据,即使它接收到NULL此指针,也不会发生任何事情。仍然糟糕的代码和任何编译器都会尖叫,但它可以运行。

HUX布斯

在大多数现代计算机上,最可能的行为是它会运行,并打印“乐趣”,因为:C+在调用函数之前不检查指针是否为空fun()不是虚拟的,因此不需要引用要调用的vtablefun()fun()中的任何成员变量。A所以它不需要取消对空的引用this指针。
打开App,查看更多内容
随时随地看视频慕课网APP