gpt4 book ai didi

c++ - 堆栈和堆碰撞时会发生什么

转载 作者:IT老高 更新时间:2023-10-28 13:58:16 26 4
gpt4 key购买 nike

我很想知道当栈和堆碰撞时会发生什么。如果有人遇到过这种情况,请他们解释一下这个场景。

最佳答案

在现代操作系统上运行的现代语言中,您会遇到堆栈溢出(万岁!)或 malloc()sbrk()mmap() 当你尝试增加堆时会失败。但并不是所有的软件都是现代的,所以让我们来看看故障模式:

  • 如果堆栈增长到堆中,典型的 C 编译器将默默地开始覆盖堆的数据结构。在现代操作系统上,会有一个或多个虚拟内存保护页面,以防止堆栈无限增长。只要保护页面中的内存量至少与增长过程的激活记录的大小一样大,操作系统就会向您保证段错误。如果你在没有 MMU 的机器上运行 DOS,你可能会被水洗。

  • 如果堆增长到堆栈中,操作系统应该始终意识到这种情况,并且某种系统调用将会失败。 malloc() 的实现几乎肯定会注意到失败并返回NULL。之后会发生什么取决于您。

我总是对编译器编写者希望操作系统放置保护页以防止堆栈溢出的意愿感到惊讶。当然,这个技巧很有效,直到你开始拥有数千个线程,每个线程都有自己的堆栈......

关于c++ - 堆栈和堆碰撞时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1334055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com