c++ - 堆栈是如何初始化的?

标签 c++ c linux

当一个进程请求内存并且操作系统正在向该进程提供一些新页面时,内核应该初始化这些页面(例如用零)以避免显示另一个进程使用的潜在可靠数据。当一个进程正在启动并接收一些内存时也是如此,例如堆栈段。

当我在 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;
}
  1. 为什么它也没有设置为零?
  2. 可能是因为它正在被进程重用?
  3. 如果是,会不会是之前使用了那 3-4 kB 内存的初始化代码?

最佳答案

操作系统不保证内存归零,只是你拥有它。它可能会为您提供以前使用过的内存页面(或以前从未使用过,但非零)。如果应用程序存储了潜在的敏感数据,则应在 free()'ing 之前将其归零。

它没有设置为零,因为这将执行不必要的工作。如果您分配 20 兆字节来存储纹理或几帧视频,为什么操作系统会将零写入所有内存,以便您可以在接下来的操作中覆盖它们。

作为一般规则,操作系统不会做任何他们不需要做的事情。

编辑:稍微扩展一下,当您“分配”一 block 内存时,操作系统所做的就是将内存页面(通常为 4096 字节的 block )从一个未分配的池中重新分配给您的进程。分配的页面。您还可以拥有共享内存,在这种情况下,操作系统将它们“分配”给多个进程。这就是所有的分配金额。

关于c++ - 堆栈是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266260/

相关文章:

c++ - 我们应该为中间继承类提供默认实现吗

c++ - 如何插入 UV 坐标?

c++ - 非空原始指针和 nullptr 之间的运算符小于

c - 在 C 中使用键字符串对字符串进行编码

arrays - 如何将指针/数组作为参数传递给 GTK 回调函数?

linux - 命令未在 Linux EC2 实例启动时运行

linux - $(($RANDOM % 10 +1)) 和 $(( ( RANDOM % 10 ) + 1 )) 有什么区别

c++ - 控制台中的滚动菜单

c++ - 3D 示例中的稳定流体

linux - 期望脚本无法使用 ssh 从文件获取输入