堆栈溢出与堆栈崩溃

  • 本文关键字:堆栈 崩溃 栈溢出 c
  • 更新时间 :
  • 英文 :


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

这里广泛讨论了堆栈溢出,这意味着当没有足够的堆栈内存并且其他数据被覆盖时会出现溢出情况,从而导致未定义的行为。

"堆栈崩溃"很可能是第一个的同义词,尽管我听说它(或栈损坏)表示,主要在调试环境中,当堆栈指针损坏时,会导致所有与调试堆栈相关的视图(显然还有被调试对象)停滞。

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

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

不知道你从哪里听说过这些术语,尤其是"堆栈崩溃",但为了避免混淆,我不会使用它。

我从未听说过堆栈崩溃

一般来说,内存访问有两种错误:

  1. 您违反了某些内存保护(试图以只读方式写入部分或访问您不能访问的内存)

  2. 你访问了一个内存,你有权利,但在一个糟糕的方式

堆栈溢出通常用于程序有意或无意通过溢出堆栈内部的结构来破坏堆栈内容的情况。这与情况(2)非常相似。

溢出堆栈时,也会使用它,例如,通过交错到许多函数调用。这与情况(1)非常相似。例如,Java在这种情况下会给您一个StackOverflow异常。

两种情况都有heap。缓冲区溢出是以错误的方式访问内存并损坏堆中数据的示例(如果缓冲区在堆中)。在这种情况下,我们可以说这是堆溢出

您也可以尝试访问进程堆区域中当前未分配的一些内存。这将根据虚拟内存层的不同而导致不同的场景。有时,您可以使用内存,但由于之前没有分配内存,这将导致未来内存损坏(出现时未报告,很难追溯)。有时,虚拟内存层能够检测到您的访问违规,并将中止您的进程(Unix可以将其报告为Bus errorSegmentation fault)。

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

最新更新