堆栈内存错误创建核心文件?

时间:2012-11-16 07:49:03

标签: c++ c

我从来没有见过这个,但我脑子里有这个东西!

这里的堆栈内存错误也可能是内存损坏。 假设c / c ++程序中存在堆栈溢出。

是否会创建核心转储文件?

2 个答案:

答案 0 :(得分:1)

堆栈溢出不会始终创建核心转储文件。如果幸运的话,它只是一个简单的堆栈溢出,一些局部变量或缓冲区被覆盖。它可能不会导致程序的任何异常行为,也不会导致核心转储文件。

但是,如果堆栈溢出会覆盖一些本地变量,这些变量是指针或返回地址,当你使用指针时,它现在是无效地址并指向未映射的内存页面,或者程序使用指针写入读取 - 只有页面,它会导致分段错误,并创建核心转储文件。或者返回地址被覆盖,CPU返回无效的寻址空间或执行无效代码,它也会导致异常并创建核心文件。

答案 1 :(得分:1)

这取决于操作系统和语言运行时。我假设你正在讨论一些Unix / Linux的问题,因为你提到了核心转储。

通常,堆栈之外会有一些未映射的虚拟内存(可能是单页)。如果溢出的数量少于该数量,则程序将尝试访问该数据,从而产生分段错误。如果程序没有处理信号,那么它将中止;如果启用了核心转储,那么将生成一个。您可能需要启用核心转储,可能使用用于启动程序的shell中的ulimit -c unlimited

如果你大量溢出,那么你可能会覆盖程序内存的其他部分。如果发生这种情况,那么所有赌注都会被取消;该计划可能会崩溃,或者可能继续处于腐败状态,并在未来的任何时候造成任何形式的损害。

假设“溢出”意味着使用的堆栈内存比深度调用堆栈和大型自动对象的某种组合所分配的堆栈内存要多。如果你正在谈论写入堆栈的错误部分(例如,通过对自动数组的越界访问),那么你通常会得到随机内存损坏而不是分段错误;再次,该程序可能会在一个腐败的状态下蹒跚而行,结果不可预测。