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; }
谜题解释
用于调用虚拟和非虚拟方法的不同机制引起了混乱.
在给定的代码中,非虚拟方法 say_hi() 从不显式取消引用 this 指针,从而绕过空指针取消引用错误。它本质上相当于带有按值传递参数的函数调用:
void Foo_say_hi(Foo* this); Foo_say_hi(foo);
未定义行为
从技术上讲,调用任何函数(甚至非虚拟)空指针是 C 中未定义的行为。然而,某些编译器实现可能会为特定场景提供明确定义的行为,例如上面的非虚函数调用。
注意
虽然意外的行为可能看起来虽然方便,但依赖它是有风险的,而且不是最佳实践。始终避免通过空指针访问类成员,因为这可能会导致意外且不可预测的结果。
以上是为什么在 C 中调用空指针上的非虚拟成员函数有时会起作用?的详细内容。更多信息请关注PHP中文网其他相关文章!