C++ Windows XP是否自动将阵列初始化为零?

C++ Windows XP是否自动将阵列初始化为零?,c++,arrays,windows,C++,Arrays,Windows,我们最近在我们的软件中发现了一个严重的bug,它是由假设一个动态分配的数组被初始化为零(而不是)引起的。所以问题是这样的: int* foo = new int[1]; foo[0] += 10; 我现在正试图估计这一点的影响,因为我们的环境最近也发生了一些变化:我们开始使用运行不同操作系统的新处理单元(以前使用的Win XP,现在仍在使用,此外还有一些运行Win 8的新单元) 在WinXP机器上运行的计算似乎没有问题,但在Win8上相同的二进制文件会产生乱码。因此,编译器不会初始化这些数组(

我们最近在我们的软件中发现了一个严重的bug,它是由假设一个动态分配的数组被初始化为零(而不是)引起的。所以问题是这样的:

int* foo = new int[1];
foo[0] += 10;
我现在正试图估计这一点的影响,因为我们的环境最近也发生了一些变化:我们开始使用运行不同操作系统的新处理单元(以前使用的Win XP,现在仍在使用,此外还有一些运行Win 8的新单元)


在WinXP机器上运行的计算似乎没有问题,但在Win8上相同的二进制文件会产生乱码。因此,编译器不会初始化这些数组(这些数组是经过优化的构建),但似乎Windows XP会将新分配的内存初始化为零(而Windows 8不会)。这有记录吗?我是否可以相信这一点,以便我可以假设此问题不会影响以前在Win XP计算机上执行的所有计算?

在所有Windows版本中,都不会初始化该进程的新页面。否则,这将是安全方面的失败。但是,根据地址空间布局的不同,新请求可能会或可能不会通过循环分配得到满足。自Vista以来,地址空间是随机的


但确实有可能,由于某些超出您控制范围的事件,您可能从
newint[]
甚至在XP上获得了一个可回收的内存页。这甚至可能是最初分配给进程的页面,用于响应您所做的某些操作系统调用,例如,在调用
MessageBoxA()
时将ANSI字符串转换为UTF-16。您真的不能假设所有对您来说是新的内存对您的进程来说都是新的。

您也开始使用新的IDE了吗?只需在每次这样的分配结束时添加
()
,将数组归零。应该不需要重新运行单元测试等。依赖操作系统保证从一开始就是有风险的,而且当你知道你必须支持一个平台(Win 8)而你知道没有这样的保证时,这也不是一个前进的方向。你在什么平台上编译你的程序?@dmg我们几个月前就更换了编译器,是的。但在本例中,相同的二进制文件在两种类型的处理单元上运行。@uoɯuoɹqʎ我们在Windows 7上编译。