为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++ C
阿晨1998 2019-07-02 17:17:56
当我在空对象指针上调用一个成员函数时会发生什么?我在面试中被问到以下几个问题:class A{public:     void fun()     {         std::cout << "fun" << std::endl;     }};A* a = NULL;a->fun();当执行这些代码时会发生什么,为什么呢?另见:何时对空实例调用成员函数会导致未定义的行为?
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

这是一种未定义的行为,所以任何事情都有可能发生。

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


查看完整回答
反对 回复 2019-07-02
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

按照标准,这是一种未定义的行为,因此是一件非常糟糕的事情。实际上,大多数编程平台(包括X86和其他几个体系结构)都会运行良好。


为什么?考虑类函数是如何在C+中实现的。这不是一个虚拟函数,因此这可以是对一个已知地址的静态调用。在x86程序集中,我们可以看到


mov A, 0

mov ecx, A

call a__fun

由于_FIN不需要实例数据,即使它接收到NULL此指针,也不会发生任何事情。


仍然糟糕的代码和任何编译器都会尖叫,但它可以运行。


查看完整回答
反对 回复 2019-07-02
?
HUX布斯

TA贡献1876条经验 获得超6个赞

在大多数现代计算机上,最可能的行为是它会运行,并打印“乐趣”,因为:

  • C+在调用函数之前不检查指针是否为空
  • fun()

    不是虚拟的,因此不需要引用要调用的vtable

    fun()

  • fun()

    中的任何成员变量。

    A

    所以它不需要取消对空的引用

    this

    指针。


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 606 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信