2015-02-05 56 views
3

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

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

现在我想的估计,因为最近我们也有我们的环境中进行一些更改这方面的影响:我们开始使用它运行不同的操作系统新的处理单元( Win XP之前,现在还在使用,现在除了一些运行Win 8的新单元外)。

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

+0

你是否也开始使用新的IDE? – dmg 2015-02-05 14:12:57

+0

只需在每个这样的分配末尾添加'()',以将数组归零。应该不需要重新运行单元测试等等。依靠操作系统保证首先是充满风险的,当你知道你必须支持一个你认识的平台(Win 8)时,无论如何也不是一个前进的方向没有这样的保证。 – 2015-02-05 14:14:07

+0

你在什么平台上编译你的程序? – cybermonkey 2015-02-05 14:14:31

回答

5

所有Windows版本都会发生新进程页面的零初始化。否则就会导致安全失败。但是,根据地址空间布局,新的请求可能会或可能不会被循环分配满足。而自Vista以来,地址空间是随机的。

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

+0

啊废话......但非常感谢你! – Niko 2015-02-05 15:43:10