我们最近在我们的软件中发现了一个严重的错误,这个错误是由于假设一个动态分配的数组被初始化为零(虽然它没有)。所以问题是这样的:
int* foo = new int[1];
foo[0] += 10;
我现在正在尝试估计这种情况的影响,因为我们最近也在环境中进行了一些更改:我们开始使用运行不同操作系统的新处理单元(之前的Win XP,现在仍在使用,现在另外一些运行Win 8的新单位。
在Win XP机器上运行的计算似乎没有问题,但在Win 8上,相同的二进制文件会产生乱码。所以编译器没有初始化这些数组(这些是优化的版本),但似乎Windows XP确实将新分配的内存初始化为零(而Windows 8没有)。这是在某处记录的吗?我可以相信这一点,以便我可以假设这个问题不影响以前在Win XP机器上执行的所有计算吗?
答案 0 :(得分:5)
在所有Windows版本中都会对该过程的新页面进行零初始化。否则就是安全失败。但是,根据地址空间布局,循环分配可能会或可能不会满足新请求。而且自Vista以来,地址空间是随机的。
但确实有可能由于某些事件无法控制,即使在XP上,您也可能从new int[]
获得了回收的内存页面。这甚至可能是最初分配给您的流程的页面,以响应您所做的某些操作系统调用,例如在调用MessageBoxA()
时将ANSI字符串转换为UTF-16。你真的不能假设所有新的记忆对你的过程来说都是新的。