c++ - Windows XP 是否自动将数组初始化为零?

标签 c++ arrays windows

我们最近在我们的软件中发现了一个严重的错误,这是由于假设动态分配的数组被初始化为零(但事实并非如此)造成的。所以问题是这样的:

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/

相关文章:

java - 从压缩数据中获取字符串,反之亦然

c - 将未知大小的结构数组传递给函数并填充

php - Windows 上的 PEAR 目录问题

c++ - 类能否使用此指针或其他方式将自身指向不同的地址?

jquery - 发布数组 jquery 序列化

c# - 服务错误 1053 : Could not start in timely fashion

mysql - 使用源 MySQL 抑制 Windows 事件日志中的警告

c++ - 在运行的 Windows 控制台应用程序中处理拖放文件

c++ - 具有 4 个维度的 std::vector 的性能

c++ - 在 OpenGL 中更改相机位置和方向?