这更像是一个理论问题。为什么c ++应用程序在跟踪空指针时会崩溃?
崩溃机制是否有意保护应用程序正在运行的系统,或者来自语言核心的不可避免的事实?如果是后者,那么将来可以预期的空指针的自动处理是什么?
答案 0 :(得分:5)
为什么c ++应用程序在跟踪空指针时会崩溃?
...
还是一个不可避免的事实来自语言的核心?
该标准没有规定平台应该/必须如何处理访问空指针。它只是未定义的行为。当您关注/取消引用空指针时,平台可以自由选择对它们有意义的任何操作。
答案 1 :(得分:5)
遵循空指针时,C ++应用程序可能崩溃。 C ++标准中没有任何内容表明它们会。尝试取消引用空指针会调用所谓的“未定义行为”,这意味着标准拒绝说明会发生什么。
至于为什么大多数情况会导致崩溃,大多数编译器作弊并在字节0处产生空指针点,并且许多操作系统使地址0不可写(有时也不可读)因此尝试访问地址会触发处理器故障
至于自动处理问题,这正是触发故障的关键。 (另一种方法是让程序无法运行。)在此之后没有进一步的自动化 - 程序已经脱轨并且无法信任,操作系统无法知道你是什么我试图指出。
答案 2 :(得分:4)
取消引用空指针的崩溃是因为OS将无效页面映射到接近0的地址,因此在取消引用空指针而不是破坏其数据时,在OS下运行的程序将崩溃。没有任何迹象表明操作系统会这样做,如果您的代码在没有操作系统(嵌入式或裸机)的情况下运行,则可能存在地址0处的内存,可能会因写入空指针而损坏。
答案 3 :(得分:2)
如果是后者,那么将来可以预期的空指针的自动处理是什么?
除非C ++作为一种语言会走向完全不同的方向。目前C ++标准表示您可以从有效程序中获得什么,它没有指定在程序行为不当时期望或不期望的内容,因此我不希望对导致UB的此情况或其他情况进行任何标准的额外处理。有些平台可能会或可能不会做一些自动操作,但我怀疑它会成为这种语言的标准方式。