为什么内核不清除进程中第二个 malloc 分配的内存?

Zhi*_*Zhi 1 c linux memory-leaks memory-management

请遵循以下两个问题:

  1. 内核将内存归零?

  2. 如果为了安全起见对堆进行零初始化,那么为什么堆栈只是未初始化?

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

const size_t n = 4;
const size_t m = 0x10;

int main()
{
        int *p = malloc(m*sizeof(int));
        printf("%p ", p);
        for (size_t i = 0; i < m; ++i) {
            printf("%d", p[i]);
        }
        printf("\n");

        memset(p,9,m*sizeof(int));
        free(p);

        int *v = malloc(m*sizeof(int));
        printf("%p ", v);
        for (size_t j = 0; j < m; ++j) {
            printf("%x", v[j]);
        }

        printf("\n");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0xaaaae7082260 0000000000000000
0xaaaae7082260 0090909099090909909090990909099090909909090990909099090909909090990909099090909909090990909099090909
Run Code Online (Sandbox Code Playgroud)

我有一个问题:在一个进程中,malloc第一次使用malloc. 但是mallocfree第一个分配的内存之后重用分配了一个新的内存,新的内存与第一个内存具有相同的虚拟地址和相同的内容。

我的问题:内核如何知道内存首先分配给进程并需要设置为零?

内核怎么知道内存被重新分配给了同一个进程,不需要清除?

Joh*_*136 5

从操作系统为内存池获取一块内存和重用内存池中已有的内存是两件不同的事情。

操作系统可能会在您第一次获取内存时将其清零,但是否将内存清零(在 free 或 malloc 上)取决于“malloc”实现。