当我在空对象指针上调用一个成员函数时会发生什么?我在面试中被问到以下几个问题:class A{public:
void fun()
{
std::cout << "fun" << std::endl;
}};A* a = NULL;a->fun();当执行这些代码时会发生什么,为什么呢?另见:何时对空实例调用成员函数会导致未定义的行为?
3 回答
皈依舞
TA贡献1851条经验 获得超3个赞
"fun"
幕布斯7119047
TA贡献1794条经验 获得超8个赞
按照标准,这是一种未定义的行为,因此是一件非常糟糕的事情。实际上,大多数编程平台(包括X86和其他几个体系结构)都会运行良好。
为什么?考虑类函数是如何在C+中实现的。这不是一个虚拟函数,因此这可以是对一个已知地址的静态调用。在x86程序集中,我们可以看到
mov A, 0
mov ecx, A
call a__fun
由于_FIN不需要实例数据,即使它接收到NULL此指针,也不会发生任何事情。
仍然糟糕的代码和任何编译器都会尖叫,但它可以运行。
HUX布斯
TA贡献1876条经验 获得超6个赞
C+在调用函数之前不检查指针是否为空 fun()
不是虚拟的,因此不需要引用要调用的vtable fun()
fun()
中的任何成员变量。 A
所以它不需要取消对空的引用 this
指针。
- 3 回答
- 0 关注
- 606 浏览
添加回答
举报
0/150
提交
取消