访问 NULL 指针上的类成员:异常和解释
在提供的 C 代码片段中,观察到函数调用即使对象指针为 NULL,非虚拟方法也会成功,而虚拟函数调用会导致应用程序崩溃。这种奇怪的行为提出了两个基本问题:
1。非虚拟方法如何在 NULL 指针上工作?
与虚拟函数调用不同,非虚拟函数调用不需要 vtable 查找。编译器直接将函数调用翻译成指向要执行的特定函数的机器代码指令。该函数将作为隐藏参数传递给调用该函数的对象的指针。
在给定的代码中,函数 say_hi() 不会对 Foo 类的成员进行任何引用。因此,无需解引用 this 指针即可执行。本质上,对 say_hi() 的调用相当于:
void Foo_say_hi(Foo* this); Foo_say_hi(foo); // where foo is NULL
由于该函数从不尝试访问对象的成员,因此它不会遇到取消引用 NULL 指针的未定义行为。
2.对象 foo 在哪里分配?
在提供的代码中,foo 被声明为 Foo* 类型的局部变量。由于没有给它特定的内存分配,因此它很可能像其他局部变量一样在主函数的堆栈上分配。然而,foo 中存储的值是一个 NULL 指针,表明它没有指向 Foo 类型的有效对象实例。
以上是为什么空指针上的非虚函数调用成功而虚函数调用失败?的详细内容。更多信息请关注PHP中文网其他相关文章!