首页 > 后端开发 > C++ > 为什么空指针上的非虚函数调用成功而虚函数调用失败?

为什么空指针上的非虚函数调用成功而虚函数调用失败?

Susan Sarandon
发布: 2025-01-03 20:43:41
原创
529 人浏览过

Why Does a Non-Virtual Function Call Succeed on a NULL Pointer While a Virtual Function Call Fails?

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

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