当一个进程请求内存并且操作系统正在向该进程提供一些新页面时,内核应该初始化这些页面(例如用零)以避免显示另一个进程使用的潜在可靠数据。当一个进程正在启动并接收一些内存时也是如此,例如堆栈段。
当我在 Linux 中执行以下代码时,结果是大部分分配的内存确实为 0,但在堆栈底部大约有 3-4 kB(数组的最后一个元素,最高地址)包含随机数。
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int * a = (int*)alloca(sizeof(int)*2000000);
for(int i = 0; i< 2000000; ++i)
cout << a[i] << endl;
return 0;
}
- 为什么它也没有设置为零?
- 可能是因为它正在被进程重用?
- 如果是,会不会是之前使用了那 3-4 kB 内存的初始化代码?
最佳答案
操作系统不保证内存归零,只是你拥有它。它可能会为您提供以前使用过的内存页面(或以前从未使用过,但非零)。如果应用程序存储了潜在的敏感数据,则应在 free()'ing 之前将其归零。
它没有设置为零,因为这将执行不必要的工作。如果您分配 20 兆字节来存储纹理或几帧视频,为什么操作系统会将零写入所有内存,以便您可以在接下来的操作中覆盖它们。
作为一般规则,操作系统不会做任何他们不需要做的事情。
编辑:稍微扩展一下,当您“分配”一 block 内存时,操作系统所做的就是将内存页面(通常为 4096 字节的 block )从一个未分配的池中重新分配给您的进程。分配的页面。您还可以拥有共享内存,在这种情况下,操作系统将它们“分配”给多个进程。这就是所有的分配金额。
关于c++ - 堆栈是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266260/