Windows XP是否自动将数组初始化为零
Does Windows XP automatically initialize arrays to zero?
我们最近在软件中发现了一个严重的错误,它是由于假设动态分配的数组初始化为零(而不是)而引起的。所以问题是这样的:
int* foo = new int[1];
foo[0] += 10;
我现在正试图估计这一点的影响,因为我们最近的环境也发生了一些变化:我们开始使用运行不同操作系统的新处理单元(以前的Win XP仍然在使用,现在除了一些运行Win 8的新单元之外)。
在WinXP机器上运行的计算似乎没有问题,但在Win8上,相同的二进制文件会产生胡言乱语。因此编译器不会初始化这些数组(这些都是经过优化的构建),但看起来Windows XP确实将新分配的内存初始化为零(而Windows 8没有)。这是有文件记录的地方吗?我能相信这一点吗?这样我就可以假设这个问题不会影响以前在Win XP机器上执行的所有计算吗?
在所有Windows版本中,进程新页面的初始化为零。否则,这将是安全方面的失误。然而,根据地址空间布局的不同,新的请求可能会被回收分配所满足,也可能不会被回收分配满足。自Vista以来,地址空间是随机的。
但确实有可能,由于某些事件超出了您的控制范围,您可能已经从new int[]
获得了一个回收内存页,甚至在XP上也是如此。这甚至可能是一个最初分配给进程的页面,以响应您所做的一些操作系统调用,例如,当您调用MessageBoxA()
时,将ANSI字符串转换为UTF-16。你真的不能假设所有对你来说是新的记忆对你的过程来说都是新的。
相关文章:
- C++使用整数的压缩数组初始化对象
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 运行时C++数组初始化问题
- 使用带有参数包的数组的成员数组初始化类
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- C++ 2 个指针数组初始化 C2440
- C++结构字符数组初始化
- C++中的多维数组初始化
- constexpr数组初始化
- C++引物动态数组初始化程序的数目超过大小
- 使用std::index_sequence对std::数组初始化进行包扩展
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何确定结构数组初始化的大小?
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 此代码中的数组初始化样式是什么?这是标准的吗?
- C++ 使用数组初始化时的 STL 向量内存管理