c++ - 为什么堆栈溢出会导致总线错误 10 而不是段错误

标签 c++ function recursion stack-overflow

谁能解释为什么递归调用期间的堆栈溢出会导致总线错误而不是段错误(Mac OS)?

我有一个被递归调用数千次的函数。正如我所料,它达到了堆栈限制,但在其他情况下会导致段错误,这是合乎逻辑的,但为什么它是总线错误 10?据我所知,引用未对齐的内存会导致总线错误,但为什么在达到堆栈限制时会出现这种情况?

最佳答案

总线错误和分段违规都是由程序访问不应访问的内存造成的,但它们是由不同的机制检测和发出信号的。

详细信息因操作系统而异。以下观察结果或多或少是 UNIX 主机上发生的情况。

如果操作系统检测到某个进程正在访问操作系统尚未分配给该进程的内存(例如分配给另一个进程),它会向违规进程发送 SIGSEGV 信号。然后进程/程序终止,报告分段违规。

但是,如果硬件检测到对物理上不存在的硬件资源的访问,则会引发操作系统捕获的硬件故障,操作系统会向执行违规指令的进程发送 SIGBUS 信号。未对齐的内存访问也可能发生这种情况 - 引发硬件故障,并被操作系统捕获,该操作系统向原始进程发送信号。

虽然细节有所不同(例如操作系统或内核如何响应硬件故障,或者向违规进程发送什么信号),但总体思路是相似的。

关于c++ - 为什么堆栈溢出会导致总线错误 10 而不是段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57287267/

相关文章:

c++ - 成员函数指针c++

c++ - 如何使用 Apache Thrift 在单个 catch 语句中捕获所有自定义异常?

javascript - 为什么我可以输入一个量表上的参数?

php - 通过调用另一个函数设置函数中的静态变量

java - 在java fx中使用堆栈和循环绘制树

java - 递归创建一棵树

c++ - 类成员不是引用而是构造函数,参数通过引用传递

c - 运行一段时间后出现段错误(核心已转储)

C-修复递归中的堆栈溢出

c++ - 如何定义 is_iterator 类型特征?