我很想知道当堆栈和堆冲突时会发生什么。如果有人遇到过这种情况,请他们可以说明情况。

最佳答案

在运行于现代OS上的现代语言中,当您尝试增加堆时,将会出现堆栈溢出(欢呼!),或者malloc()sbrk()mmap()将失败。但是并非所有软件都是最新的,因此让我们看一下故障模式:

  • 如果堆栈扩展到堆中,通常的C编译器将以静默方式开始覆盖堆的数据结构。在现代操作系统上,将存在一个或多个虚拟内存保护页面,它们可防止堆栈无限期增长。只要保护页面中的内存量至少与增长过程的激活记录的大小一样大,操作系统就会向您保证存在段错误。如果您的DOS是在没有MMU的计算机上运行的,则可能是软管问题。
  • 如果堆增长到堆栈中,则操作系统应始终了解情况,并且某些类型的系统调用将失败。 malloc()的实现几乎肯定会注意到失败并返回NULL。这取决于您。

  • 我总是对编译器作者愿意为操作系统放置保护页面以防止堆栈溢出而感到惊讶。当然,在您开始拥有成千上万的线程(每个线程都有自己的堆栈)之前,此技巧非常有效。

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

    10-11 16:50