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