堆栈溢出流和堆栈崩溃之间有什么区别?何时发生堆栈崩溃?什么是堆超过流和堆崩溃。当堆栈超过流/堆超过流时会发生什么?
发布于 2014-11-04 11:16:45
堆栈溢出是在此广泛讨论,当没有足够的堆栈内存和其他数据被覆盖时,意味着溢出条件,导致未定义的行为。
“堆栈崩溃”可能是第一个的同义词,尽管我听说过它(或者堆栈损坏),主要是在调试环境中,它指示堆栈指针何时损坏,导致所有调试堆栈相关的视图停止运行(很明显,调试也是如此)。
堆溢出通常不会发生,除非是在一些内存池管理的情况下,因为假设操作系统做得很好,就永远无法通过将其标记为可写来覆盖已使用的内存块。如果堆内存耗尽,系统可能会告诉您这一点,然后失败。
堆崩溃可以定义为堆内存的无效使用,例如访问冲突或访问无效地址。它应该属于内存损坏和存储违规这两个更广泛的术语(这些术语可能与堆栈溢出有关)。
不知道您在哪里听说过这些术语,特别是“堆栈崩溃”,但我不会使用它来避免混淆。
发布于 2014-11-04 11:36:08
我从没听说过Stack crash。
通常,内存访问有两种错误:
当程序有意或无意地溢出堆栈内容时,通常使用堆栈溢出式。这很像案例(2)。
当您的溢出堆栈时,它也被使用,例如,通过交织到许多函数调用。这很像案例(1)。例如,在本例中,Java为您提供了一个StackOverflow异常。
堆也有这两种情况。缓冲区溢出是以不好的方式访问内存和破坏堆中数据(如果缓冲区在堆中)的一个例子。在这种情况下,我们可以说它是一个堆溢出。
您还可以尝试访问当前未分配的进程堆区域中的一些内存。这将导致您根据虚拟内存层的不同场景。有时,您可以使用内存,但由于以前没有分配内存,因此会导致未来的内存损坏(出现时没有报告,很难追溯)。有时,虚拟内存层将能够检测您的访问冲突,并中止您的进程(Unix可以将其报告为Bus error或Segmentation fault)。
还可以通过分配过多的内存来占用所有的堆空间。这是一个堆耗尽,一种堆溢出.
https://stackoverflow.com/questions/26733412
复制相似问题