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