如果我取消引用空指针,为什么操作系统不会崩溃?

Sta*_*ked 3 c++

取消引用空指针会导致未定义的行为.在实践中,它通常意味着我的程序会崩溃.但为什么操作系统不会崩溃?因为如果我的程序取消引用空指针,并且我的程序由操作系统运行,那么,根据逻辑传递性规则,这意味着操作系统试图取消引用空指针.为什么OS不进入"未定义行为"状态?

Mik*_*our 11

C++标准没有定义行为,要么保证崩溃,要么做其他事情.这并不妨碍操作系统定义行为 - 它不是C++程序,因此它不必遵守C++程序的"规则" [1].即便如此,操作系统也不会取消引用指针本身.

在大多数现代平台上,访问解除引用指针的目标将导致内存管理硬件引发异常(通常称为"分段故障"或"保护故障").这是由内核捕获的,内核可以确定执行哪个进程,并且终止进程或向其发送信号.

因此,在这样的平台上,取消引用空指针的进程的默认行为将是崩溃; 操作系统本身没有任何理由崩溃.

[1] 我指的是非正式的"规则",即程序应该格式良好并避免未定义的行为 - 不要与语言标准指定的C++实现的正式"规则"混淆.