为什么我的动态分配数组初始化为0?

时间:2013-12-08 20:03:56

标签: c++ arrays gdb

我有一些代码用

创建一个动态分配的数组
int *Array = new int[size];

据我所知,Array应该是指向内存中Array的第一项的指针。当使用gdb时,我可以调用x Array来检查第一个内存位置的值,x Array + 1来检查第二个内存位置等等。我希望在我之前的内存中使用那些点的任何应用程序都会留下垃圾值。但是,使用x Array会为所有这些点返回0x00000000。我究竟做错了什么?我的代码是否将Array的所有值初始化为零?

编辑:为了记录,我问,因为我的程序试图实现这个:http://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time/。我想确保我的算法没有通过数组递增来将每个元素初始化为0.

2 个答案:

答案 0 :(得分:3)

在大多数现代操作系统中,操作系统为应用程序提供了零页面,而不是让信息在不相关的进程之间渗透。例如,这对于安全原因很重要。回到旧的DOS时代,事情变得更加随意。今天,对于受内存保护的操作系统,操作系统通常会给你零开始。

因此,如果此new在程序的早期发生,则您可能会获得零。尽管如此,你仍然会疯狂地依靠它;如果你这样做,那就是未定义的行为。

如果继续分配,填充和释放内存,最终new将返回未归零的内存。相反,它会包含你的过程中残留的早期涂鸦。

并且无保证new的任何特定调用,即使在程序开始时,也会返回填充零的内存。您只是可能在程序的早期看到new的来电。 不要误导你。

答案 1 :(得分:1)

  

我希望从使用这些广告的应用程序中留下垃圾值

这当然是可能的,但绝不保证。特别是在调试版本中,您可能会将运行时归零(或用一些可识别的位模式填充),以帮助您在错误地使用内存时调试内容。

而且,实际上,“这些点”是一个相当松散的术语,给定虚拟寻址。

重要的是,不,您的代码将所有这些值设置为零。