Windows XP 会自动将数组初始化为零吗?

Posted

技术标签:

【中文标题】Windows XP 会自动将数组初始化为零吗?【英文标题】:Does Windows XP automatically initialize arrays to zero? 【发布时间】:2015-02-05 14:04:20 【问题描述】:

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

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

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

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

【问题讨论】:

你也开始使用新的 IDE 了吗? 只需在每个此类分配的末尾添加 () 即可将数组归零。不需要重新运行单元测试等。首先,依赖操作系统保证充其量是有风险的,而且当您知道必须支持您知道的平台(Win 8)时,无论如何都不是前进的道路没有这样的保证。 你在什么平台上编译你的程序? @dmg 几个月前我们已经更换了编译器,是的。但在这种情况下,相同的二进制文件在两种类型的处理单元上运行。 @ʎǝʞuoɯɹǝqʎɔ 我们正在 Windows 7 上编译。 【参考方案1】:

在所有 Windows 版本中都会对进程的新页面进行零初始化。否则将是安全失败。但是,根据地址空间布局,新请求可能会或可能不会被回收的分配满足。从 Vista 开始,地址空间是随机的。

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

【讨论】:

以上是关于Windows XP 会自动将数组初始化为零吗?的主要内容,如果未能解决你的问题,请参考以下文章

数组何时自动初始化为其默认数据类型?

c语言中怎么把一维数组初始化为全零啊,不用循环

关于memset()

第8章:数组

请教Delphi高手:如何将字符数组初始化

将数组中的所有元素初始化为 NaN 的最快方法是啥?