首页 >后端开发 >C++ >为什么在 NULL 指针上调用非虚拟方法不会导致未定义的行为?

为什么在 NULL 指针上调用非虚拟方法不会导致未定义的行为?

Susan Sarandon
Susan Sarandon原创
2024-12-31 18:44:13239浏览

Why Does Calling a Non-Virtual Method on a NULL Pointer Not Result in Undefined Behavior?

通过 NULL 指针访问类成员

尽管被声明为指向 Foo 类型实例的指针,但 foo 变量被初始化为0,使其成为空指针。这可能看起来违反直觉,因为访问空指针的成员通常是未定义的行为。然而,某些情况允许这种行为。

非虚拟方法调用

尽管有空指针,但非虚拟方法 say_hi() 仍被成功调用,因为它不是虚拟方法。虚拟方法需要一个有效的对象来根据对象的类型确定调用哪个函数。另一方面,非虚方法具有预定的函数地址,编译器使用该地址来生成直接函数调用指令。

具体来说,编译器生成相当于以下内容的代码:

void Foo_say_hi(Foo* this);
Foo_say_hi(foo);

由于 say_hi() 函数不引用 this 指针,因此它无需取消引用可能为 null 的指针指针。

对象分配

foo 变量是主函数中的局部变量,因此它分配在函数的堆栈上。作为指针变量,它所指向的实际对象并不是在这里分配的。 null 值表示指针没有引用有效的对象。

以上是为什么在 NULL 指针上调用非虚拟方法不会导致未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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