首页 > 后端开发 > C++ > 为什么空指针上的非虚拟方法调用有时可以避免 C 中的崩溃?

为什么空指针上的非虚拟方法调用有时可以避免 C 中的崩溃?

DDD
发布: 2024-12-14 09:29:12
原创
839 人浏览过

Why Do Non-Virtual Method Calls on Null Pointers Sometimes Avoid Crashes in C  ?

非虚拟方法调用和空指针:悖论

通过空指针访问类成员通常会导致崩溃。然而,在 C 中,某些非虚拟方法似乎即使使用空指针也可以工作。这种行为引发了几个问题:这是如何发生的,以及对象在哪里分配?

理解非虚拟方法调用

在 C 中,当在 null 上调用非虚拟方法时指针,编译器生成对与该方法关联的函数的直接调用。它通过将隐藏参数(指向对象的指针)传递给函数来实现此目的。

在提供的示例中:

编译器将其转换为:

由于 say_hi 方法从不引用对象的成员,因此它不会取消引用空指针,从而避免了错误。

未定义的行为和编译器优化

正式地,在空指针上调用任何方法都是未定义的行为。但是,编译器可以通过假设对象不为空来优化代码。这是有风险的,因为它可能会导致意外行为。

在示例中,编译器优化非虚拟方法调用以避免崩溃。但是,需要注意的是,这种行为并不能得到保证。仍应避免在空指针上调用非虚方法,因为这可能会导致未指定的结果。

对象分配

示例中 foo 指针引用的对象未在主要功能。在堆栈上创建一个类型为 Foo* 的局部变量,分配给它的值为空指针。这意味着该对象本身不存在于内存中的任何位置。

以上是为什么空指针上的非虚拟方法调用有时可以避免 C 中的崩溃?的详细内容。更多信息请关注PHP中文网其他相关文章!

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