什么捕获堆栈溢出?

时间:2014-08-26 20:11:14

标签: c++ stack heap

如果堆栈不断增长和增长,由于无限递归之类的东西,是什么捕获并停止执行?我会想象程序会(错误地)开始写入堆中,就好像它是堆栈内存一样,并继续运行直到由于堆损坏而导致潜在崩溃?

2 个答案:

答案 0 :(得分:3)

大多数运行时系统在堆栈和堆之间留下间隙。尝试访问此间隙中的内存会触发异常,该异常将转换为Stack Overflow。

答案 1 :(得分:1)

此问题与常见操作系统(例如x86)的虚拟内存管理密切相关。这些操作系统使用一种称为“分页”的技术。它使用一个表将物理内存(RAM的地址)映射到虚拟地址。每个任务都有自己的表,因此它有自己的虚拟地址范围。如果任务试图访问位于未映射到任何物理地址的虚拟地址的存储器块,或者尝试在映射到具有只读标志的物理地址的虚拟地址处写入,则触发页面错误。这种情况发生在堆栈溢出的情况下。页面错误是操作系统可以捕获的异常。在大多数情况下,它将终止相应的任务(在现代操作系统中,当然可能会将异常传播到任务本身)。有关详细信息,请参阅osdev