首页 >后端开发 >C++ >为什么在 C 中调用空指针上的非虚拟成员函数有时会起作用?

为什么在 C 中调用空指针上的非虚拟成员函数有时会起作用?

DDD
DDD原创
2024-12-13 16:58:10659浏览

Why Does Calling a Non-Virtual Member Function on a Null Pointer in C   Sometimes Work?

C 中的陷阱:访问空指针上的非虚拟类成员

在 C 中,在 null 上调用非虚拟成员函数指针可能会意外地起作用,从而提出一个奇怪的谜题。让我们通过一个有趣的代码片段深入研究这种行为:

class Foo {
public:
    virtual void say_virtual_hi() {
        std::cout << "Virtual Hi";
    }

    void say_hi() {
        std::cout << "Hi";
    }
};

int main() {
    Foo* foo = 0;
    foo->say_hi(); // Works well
    foo->say_virtual_hi(); // Crashes the app
    return 0;
}

谜题解释

用于调用虚拟和非虚拟方法的不同机制引起了混乱.

  • 虚拟方法: 需要查找 vtable 来确定要调用的函数,对于空指针来说失败,因为它们没有与其关联的有效对象。
  • 非虚拟方法: 直接编译作为函数调用,并将 this 指针(对象引用)作为隐藏参数传递。

在给定的代码中,非虚拟方法 say_hi() 从不显式取消引用 this 指针,从而绕过空指针取消引用错误。它本质上相当于带有按值传递参数的函数调用:

void Foo_say_hi(Foo* this);

Foo_say_hi(foo);

未定义行为

从技术上讲,调用任何函数(甚至非虚拟)空指针是 C 中未定义的行为。然而,某些编译器实现可能会为特定场景提供明确定义的行为,例如上面的非虚函数调用。

注意

虽然意外的行为可能看起来虽然方便,但依赖它是有风险的,而且不是最佳实践。始终避免通过空指针访问类成员,因为这可能会导致意外且不可预测的结果。

以上是为什么在 C 中调用空指针上的非虚拟成员函数有时会起作用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn