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

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

DDD
发布: 2024-12-13 16:58:10
原创
660 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板