遵循以下两个问题:
#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;
}
输出:
0xaaaae7082260 0000000000000000
0xaaaae7082260 0090909099090909909090990909099090909909090990909099090909909090990909099090909909090990909099090909
我有一个问题:在一个过程中,第一次使用malloc
时,将malloc
分配的内存设置为0。但是重新使用malloc
在第一个分配的内存free
之后分配新的内存,新的内存与第一个内存具有相同的虚拟地址和相同的内容。
我的问题:内核如何知道该内存首先分配给一个进程,并且需要将其设置为零?
并且内核如何知道将内存重新分配给相同的进程并且不需要清除?
从操作系统中为您的内存池获取一块内存并重新使用内存池中已经存在的内存是两件事。
OS可能在您首次获得内存时将内存清零,但是是否将内存清零(取决于空闲还是malloc)取决于“ malloc”实现。
“内核如何知道首先将内存分配给进程的答案”是进程(通过C库)向内核发出请求以为其分配一些内存,因此内核知道内存不应泄露其先前的内容(将分配的内存清零是确保信息不会在进程之间泄漏的一种方式)。
“内核如何知道内存已重新分配的答案...”“不是”-信息是进程专有的,内核不知道进程将重用什么内存。