我们最近在我们的软件中发现了一个严重的错误,这是由于假设动态分配的数组被初始化为零(但事实并非如此)造成的。所以问题是这样的:
int* foo = new int[1];
foo[0] += 10;
我现在正在尝试估计这方面的影响,因为我们的环境最近也发生了一些变化:我们开始使用运行不同操作系统的新处理单元(以前是 Win XP,现在仍在使用,现在又增加了一些运行 Win 8 的新设备)。
在 Win XP 机器上运行的计算似乎没有问题,但在 Win 8 上,相同的二进制文件会产生乱码。所以编译器不会初始化这些数组(这些是优化的构建),但 Windows XP 似乎会将新分配的内存初始化为零(而 Windows 8 不会)。这是在某处记录的吗?我可以相信这一点,以便我可以假设这个问题不会影响以前在 Win XP 机器上执行的所有计算吗?
最佳答案
进程新页面的零初始化发生在所有 Windows 版本中。否则将是安全故障。然而,根据地址空间布局,新请求可能会或可能不会被回收分配满足。从 Vista 开始,地址空间是随机的。
但确实有可能由于某些您无法控制的事件,即使在 XP 上,您也可能从 new int[]
获得了回收的内存页。那甚至可能是最初分配给您的进程的页面,以响应您进行的某些操作系统调用,例如在调用 MessageBoxA()
时将 ANSI 字符串转换为 UTF-16。您真的不能假设所有对您来说是新的内存对您的过程都是新的。
关于c++ - Windows XP 是否自动将数组初始化为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345981/