捕获堆栈溢出的内容
What catches stack overflow?
如果一个堆栈由于无限递归之类的原因而不断增长,那么是什么导致了这种情况并停止执行?我可以想象这个程序会(错误地)开始向堆中写入,就好像它是堆栈内存一样,并一直运行,直到堆损坏导致潜在的崩溃?
大多数运行时系统都会在堆栈和堆之间留下间隙。试图访问此间隙中的内存会触发一个异常,该异常被转换为堆栈溢出。
这个问题与常见操作系统(例如x86)的虚拟内存管理密切相关。这些操作系统使用一种称为"分页"的技术。它使用一个将物理内存(RAM的地址)映射到虚拟地址的表。每个任务都有自己的表,因此也有自己的虚拟地址范围。如果任务试图访问位于未映射到任何物理地址的虚拟地址处的存储器块,或者试图在映射到设置了只读标志的物理地址的虚地址处写入,则触发页面故障。这种情况发生在堆栈溢出的情况下。页面错误是操作系统可以捕获的异常。在大多数情况下,它将终止相应的任务(在现代操作系统中,当然可能会将异常传播到任务本身)。有关更多信息,请参阅osdev。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 递归克隆图时的堆栈溢出
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 使用递归的溢出堆栈
- c++中栈溢出和分段错误的危险