通过空指针访问类成员通常会导致崩溃。然而,在 C 中,某些非虚拟方法似乎即使使用空指针也可以工作。这种行为引发了几个问题:这是如何发生的,以及对象在哪里分配?
在 C 中,当在 null 上调用非虚拟方法时指针,编译器生成对与该方法关联的函数的直接调用。它通过将隐藏参数(指向对象的指针)传递给函数来实现此目的。
在提供的示例中:
编译器将其转换为:
由于 say_hi 方法从不引用对象的成员,因此它不会取消引用空指针,从而避免了错误。
正式地,在空指针上调用任何方法都是未定义的行为。但是,编译器可以通过假设对象不为空来优化代码。这是有风险的,因为它可能会导致意外行为。
在示例中,编译器优化非虚拟方法调用以避免崩溃。但是,需要注意的是,这种行为并不能得到保证。仍应避免在空指针上调用非虚方法,因为这可能会导致未指定的结果。
示例中 foo 指针引用的对象未在主要功能。在堆栈上创建一个类型为 Foo* 的局部变量,分配给它的值为空指针。这意味着该对象本身不存在于内存中的任何位置。
以上是为什么空指针上的非虚拟方法调用有时可以避免 C 中的崩溃?的详细内容。更多信息请关注PHP中文网其他相关文章!