2009-07-07 79 views
0

为什么堆空间始终设置为零? 为什么堆栈空间同样没有设置为零?未初始化的堆和堆栈空间值

+0

不知道你的环境的细节,没有办法回答这些问题。 – Jherico 2009-07-07 17:17:49

+1

@Abhijith - 你怎么样查找上堆的维基百科页面和第一栈... – 2009-07-07 17:19:35

回答

4

堆空间不总是设置为零。

4

答案取决于哪种语言(C++,Java等),你正在使用,也许,对编译器,也许在编译器选项太(调试与发布)。此外,行为可能无法得到保证(分配堆可能为零,当你第一次分配它,但后来你的程序已经运行,你开始重新使用堆,你可能会发现你[重新]分配非零内存)。

2

如果堆空间设置为零,可能是因为它之前没有使用过。 在堆中分配,释放并重新分配了大量内容之后,您将开始在未初始化的堆空间中找到一些旧数据。

堆栈包含来自调用堆栈中其他函数的旧局部变量。堆栈被设计为尽可能高效,所以没有时间花在擦除旧的变量上。

还记得,0不一定是什么正确的初始化器......它只是一个明智的选择;没有什么能使它独一无二地“正确”。你应该总是明确地设置局部变量的初始值!

2

你看到的是你的环境的文物,而不是给予。我会假设你正在谈论C.

话虽如此,当你从堆中它可能会或可能不会被初始化为零分配内存。在像C这样的语言中,malloc不保证内存被初始化为0,但是calloc会这样做。然而,这就是说,在实践中,如果你分配了很多东西,你会倾向于看到它充满了0。为什么?因为当你的程序没有空间来给你内存时,它会向操作系统请求更多的内存。当它这样做时,操作系统通过映射一堆虚拟页面来为其提供内存,它将在第一次访问时实际实现并填充0。现在,如果你释放堆中的一些值并用malloc分配更多的值,那么你可能会得到一些你之前所写的“脏”内存。如果你认为一切都将被初始化,这可能会导致一些微妙的错误,这些错误只有在系统运行一段时间后才会发生,或者在系统完全不同的部分进行删除后发生!

所以不要依靠fresg空间关闭堆被初始化为0,除非你问它明确初始化的内存。

至于为什么堆栈更糟的是,在堆空间被重复使用引起的随机噪声是在你刚分配的内存的同样的问题发生在堆栈上,但问题更糟糕的是,因为你从一个函数返回后打电话,你的程序只是在你上面堆满了一堆东西,并没有打算清理它。所以你几乎总是处于上面的'脏'情况。

到底,最好确保你确保它是从读前要使用一切被初始化到已知状态。