堆栈指针与应用程序

时间:2010-09-08 17:05:26

标签: c memory-management

大多数架构都有一个用户应用程序朝向的内存映射 堆栈增长到相反方向的较低内存。我在想什么 当我写这么大的C程序时,正在发生这个应用程序的所有空间 并且被带走,即堆栈指针和应用程序尝试写入相同的内容 记忆中的区域?我假设在C中发生类似分段错误的事情?在那儿 试图避免这种问题发生的任何处理器支持?

由于

3 个答案:

答案 0 :(得分:1)

不,在C中你可能会失去记忆力,你只会直接注意到如果你实际检查malloc等人的回归值。如果没有,你可能会在某处取消引用空指针,使你的应用程序崩溃。但可能没有立即可见的迹象,只有你的记忆被悄悄腐败。由于应用程序的内存空间由应用程序本身管理,因此处理器/ OS无法检测到此类错误。在现代操作系统中,操作系统本身和其他应用程序的内存空间受到应用程序的保护,因此如果您不小心尝试在自己的内存空间之外写入内存,则可能会出现分段错误。但是在你自己的记忆空间里,保护你的记忆取决于你自己。

答案 1 :(得分:1)

堆栈指针有限。一旦尝试超出允许范围,您通常会得到 StackOverflow 异常或中断,从而导致程序终止。最常见的是失控的递归函数。

类似地,堆栈的空间是保留的,堆分配器无法访问。当您尝试在没有足够空间的情况下进行堆分配(mallocnew)时,分配器通常会返回NULL或抛出 OutOfMemory 异常。

我不同意这样的答案:“没有立即可见的迹象,只有你的记忆会被悄悄地腐蚀。

您将获得StackOverflowOutOfMemory,具体取决于首先耗尽的资源。

答案 2 :(得分:1)

Abelenky是正确的,现代架构会捕获堆栈增长超过所有可用地址空间的一些限制(这很容易通过简单的递归函数进行测试)

此外,“应用程序增长,堆栈增长”并不真正描述多线程系统的内存映射,每个线程都有自己的堆栈,它具有预先设置的最大化大小,堆是一个或多个单独映射地址空间区域。

解决这个问题的最简单方法是将调试器附加到一个简单的测试程序中;你可以看到你的过程在任何体面的内存区域。一定要看看你的库和代码的加载位置,以及多个线程的堆栈。