作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我很想知道当栈和堆碰撞时会发生什么。如果有人遇到过这种情况,请他们解释一下这个场景。
最佳答案
在现代操作系统上运行的现代语言中,您会遇到堆栈溢出(万岁!)或 malloc()
或 sbrk()
或 mmap()
当你尝试增加堆时会失败。但并不是所有的软件都是现代的,所以让我们来看看故障模式:
如果堆栈增长到堆中,典型的 C 编译器将默默地开始覆盖堆的数据结构。在现代操作系统上,会有一个或多个虚拟内存保护页面,以防止堆栈无限增长。只要保护页面中的内存量至少与增长过程的激活记录的大小一样大,操作系统就会向您保证段错误。如果你在没有 MMU 的机器上运行 DOS,你可能会被水洗。
如果堆增长到堆栈中,操作系统应该始终意识到这种情况,并且某种系统调用将会失败。 malloc()
的实现几乎肯定会注意到失败并返回NULL
。之后会发生什么取决于您。
我总是对编译器编写者希望操作系统放置保护页以防止堆栈溢出的意愿感到惊讶。当然,这个技巧很有效,直到你开始拥有数千个线程,每个线程都有自己的堆栈......
关于c++ - 堆栈和堆碰撞时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1334055/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!