空指针和应用程序崩溃

Null pointers and application crashing

本文关键字:崩溃 应用程序 空指针      更新时间:2023-10-16

这更像是一个理论问题。为什么 C++ 应用程序在遵循空指针时崩溃?

崩溃机制是故意保护运行应用程序的系统,还是来自语言核心的不可避免的事实?如果是后者,将来是否可以预期自动处理空指针?

C++应用程序遵循空指针时可能会崩溃。C++标准中没有任何内容说他们会这样做。取消引用空指针的尝试会调用所谓的"未定义行为",这意味着标准拒绝说明可能发生的情况。

至于为什么大多数情况下会导致崩溃,大多数编译器作弊并在字节 0 处制作一个空指针点,并且许多操作系统使地址 0 不可写(有时也不可读(,因此尝试访问地址会触发处理器故障。

至于自动处理问题,这正是触发故障的重点。(另一种方法是让程序横行运行。在那之后,没有进一步的自动化可以完成 - 程序已经脱轨并且不可信,操作系统无法知道您试图指向什么。

为什么 C++ 应用程序在遵循空指针时崩溃?

还是一个不可避免的事实,它来自语言的核心?

该标准并未规定平台应该/必须如何处理访问空指针。这只是未定义的行为。当您关注/取消引用空指针时,平台可以自由选择对他们有意义的任何操作。

取消引用空指针的崩溃是因为操作系统将无效页面映射到接近 0 的地址,因此在操作系统下运行的程序将在取消引用空指针时崩溃,而不是损坏其数据。没有任何内容表明操作系统这样做,如果您的代码在没有操作系统(嵌入式或裸机(的情况下运行,那么地址 0 处可能存在内存,可以通过写入空指针来损坏。

如果是后者,将来是否可以预期自动处理空指针?

除非C++作为一种语言会走向完全不同的方向。目前C++标准说你可以从有效的程序中得到什么,它没有指定当你的程序行为不端时会发生什么,所以我不希望对这种情况或其他导致UB的情况进行任何标准的额外处理。有些平台可能会也可能不会执行一些自动操作,但我怀疑它是否会成为这种语言的标准方式。