Windows XP是否自动将数组初始化为零

Does Windows XP automatically initialize arrays to zero?

本文关键字:数组 初始化 XP 是否 Windows      更新时间:2023-10-16

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

int* foo = new int[1];
foo[0] += 10;

我现在正试图估计这一点的影响,因为我们最近的环境也发生了一些变化:我们开始使用运行不同操作系统的新处理单元(以前的Win XP仍然在使用,现在除了一些运行Win 8的新单元之外)。

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

在所有Windows版本中,进程新页面的初始化为零。否则,这将是安全方面的失误。然而,根据地址空间布局的不同,新的请求可能会被回收分配所满足,也可能不会被回收分配满足。自Vista以来,地址空间是随机的。

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