堆栈溢出与堆栈崩溃

时间:2014-11-04 10:57:22

标签: c

堆栈溢出和堆栈崩溃之间有什么区别。堆栈崩溃发生时? 什么是堆溢出流和堆崩溃。 堆栈溢出/堆溢出时会发生什么?

2 个答案:

答案 0 :(得分:2)

堆栈溢出为extensively discussed here,表示当堆栈内存不足而其他数据被覆盖导致未定义的行为时溢出。

" 堆栈崩溃"可能是第一个的同义词虽然我已经听到它(或者堆栈损坏)来指示,主要是在调试环境中,当堆栈指针被破坏时导致所有与调试堆栈相关的视图停止(显然也是调试对象)。

除了在某些内存池管理的情况下,通常不会发生堆溢出,因为假设操作系统做得很好,您将永远不会通过将标记为可写的内容来覆盖已使用的内存块。如果堆内存耗尽,系统可能会告诉您并失败。

堆崩溃可能被定义为堆内存的无效使用,例如:访问冲突或访问无效地址。它应该属于更广泛的术语memory corruptionstorage violation(这些术语可能与堆栈溢出有关)。

不确定您在哪里听说过这些条款,特别是"堆栈崩溃",但我不会用它来避免混淆。

答案 1 :(得分:0)

我从未听说过堆栈崩溃

通常,内存访问会出现两种错误:

  1. 你违反了一些内存保护(尝试以只读方式写入) 分享或访问你不能

  2. 的记忆
  3. 您以正确的方式访问您拥有的内存

  4. 堆栈溢出通常在程序故意或不通过溢出其内部结构来破坏堆栈内容时使用。这很像情况(2)。

    超出堆栈时,也可​​以通过交错到多个函数调用来使用它。这很像情况(1)。例如,Java会在这种情况下为您提供StackOverflow异常。

    你也有堆的情况。 缓冲区溢出是一个以坏方式访问内存并破坏堆中数据的示例(如果缓冲区在堆中)。在这种情况下,我们可以说它是堆溢出

    您还可以尝试访问当前未分配的进程的Heap区域中的某些内存。这将根据虚拟内存层引导您进入不同的场景。有时您可以使用内存,但因为它以前没有分配,它将导致您将来的内存损坏(在它出现时没有报告,很难追溯)。 有时,虚拟内存层将能够检测到您的访问冲突,并将中止您的进程(Unix可以将其报告为Bus errorSegmentation fault)。

    您还可以通过分配太多内存来消耗所有堆空间。这是堆耗尽一种堆溢出 ......