为什么堆空间始终设置为零? 为什么堆栈空间同样没有设置为零?未初始化的堆和堆栈空间值
回答
堆空间不总是设置为零。
答案取决于哪种语言(C++,Java等),你正在使用,也许,对编译器,也许在编译器选项太(调试与发布)。此外,行为可能无法得到保证(分配堆可能为零,当你第一次分配它,但后来你的程序已经运行,你开始重新使用堆,你可能会发现你[重新]分配非零内存)。
如果堆空间设置为零,可能是因为它之前没有使用过。 在堆中分配,释放并重新分配了大量内容之后,您将开始在未初始化的堆空间中找到一些旧数据。
堆栈包含来自调用堆栈中其他函数的旧局部变量。堆栈被设计为尽可能高效,所以没有时间花在擦除旧的变量上。
还记得,0不一定是什么正确的初始化器......它只是一个明智的选择;没有什么能使它独一无二地“正确”。你应该总是明确地设置局部变量的初始值!
你看到的是你的环境的文物,而不是给予。我会假设你正在谈论C.
话虽如此,当你从堆中它可能会或可能不会被初始化为零分配内存。在像C这样的语言中,malloc不保证内存被初始化为0,但是calloc会这样做。然而,这就是说,在实践中,如果你分配了很多东西,你会倾向于看到它充满了0。为什么?因为当你的程序没有空间来给你内存时,它会向操作系统请求更多的内存。当它这样做时,操作系统通过映射一堆虚拟页面来为其提供内存,它将在第一次访问时实际实现并填充0。现在,如果你释放堆中的一些值并用malloc分配更多的值,那么你可能会得到一些你之前所写的“脏”内存。如果你认为一切都将被初始化,这可能会导致一些微妙的错误,这些错误只有在系统运行一段时间后才会发生,或者在系统完全不同的部分进行删除后发生!
所以不要依靠fresg空间关闭堆被初始化为0,除非你问它明确初始化的内存。
至于为什么堆栈更糟的是,在堆空间被重复使用引起的随机噪声是在你刚分配的内存的同样的问题发生在堆栈上,但问题更糟糕的是,因为你从一个函数返回后打电话,你的程序只是在你上面堆满了一堆东西,并没有打算清理它。所以你几乎总是处于上面的'脏'情况。
到底,最好确保你确保它是从读前要使用一切被初始化到已知状态。
- 1. 未初始化值由堆栈分配
- 2. 初始化一个空的堆栈
- 3. 重新初始化堆栈
- 4. 初始化堆栈指针
- 5. WebAssembly堆栈/堆栈指针初始化和内存布局
- 6. 未初始化的值是由堆栈分配创建的
- 7. 保证堆栈记录的初始化
- 8. java.lang.OutOfMemoryError:初始化数组时初始化Java堆空间
- 9. 在ATtiny2313上初始化堆栈指针
- 10. 初始化的java数组是否进入堆栈或堆?
- 11. C++ googlemocks:获取未初始化的调用的堆栈跟踪
- 12. C++堆栈:未初始化的局部变量
- 13. 如何找到未初始化的堆栈变量
- 14. 错误:longjmp导致未初始化的堆栈帧
- 15. Valgrind无法找到未初始化数据的堆栈分配
- 16. 进程虚拟内存 - 堆栈和堆之间的空间
- 17. Java - 如何初始化堆栈使用另一个现有堆栈?
- 18. 未初始化的值是通过堆栈分配创建的 - valgrind
- 19. 哈希表“未初始化的值是通过堆栈分配创建的”
- 20. “未初始化的值是由堆栈分配创建的”在C++ std :: map
- 21. 用多达10个值初始化堆栈
- 22. 使用默认值初始化队列或堆栈?
- 23. 用尽ValueType堆栈空间
- 24. 堆栈空间不足
- 25. 堆栈空间异常
- 26. 增加堆栈空间
- 27. JVM - 堆栈和堆栈
- 28. OOP和堆/堆栈
- 29. 块,堆栈和堆
- 30. 现代计算机的堆栈和堆空间
不知道你的环境的细节,没有办法回答这些问题。 – Jherico 2009-07-07 17:17:49
@Abhijith - 你怎么样查找上堆的维基百科页面和第一栈... – 2009-07-07 17:19:35