c - 为什么内核不清除进程中第二个malloc分配的内存?
问题描述
请遵循以下两个问题:
#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
在第一次使用时设置为 0 malloc
。但是在第一次分配的内存之后重用malloc
分配新的内存free
,新的内存与第一个内存具有相同的虚拟地址和相同的内容。
我的问题:内核如何知道内存首先分配给进程并且需要设置为零?
内核如何知道内存被重新分配给同一个进程并且不需要被清除?
解决方案
从操作系统中为内存池获取一块内存和重用内存池中已有的内存是两件不同的事情。
当您第一次获得它时,操作系统可能会将内存归零,但它是否将内存归零(在空闲或 malloc 上)取决于“malloc”实现。
推荐阅读
- r - 如何使用 R 中的网络抓取从网站下载文件?
- javascript - 我无法使用 var audio=new Audio("Audio track"); 方法播放音频 音频播放()
- blazor - 是否可以在不使用@ref 的情况下在其自己的标签主体中使用 Parent 属性?
- android - 有什么办法知道 Firebase 写入是否已添加到本地队列中?
- email - 使用例如 Outlook Web Access (OWA) 时如何发送电子邮件
- react-native - 与 EXPO 共享图像
- java - Flink 有异步源码功能吗?
- python - python没有将值返回给节点
- java - 使用 JavaFX 中的箭头键导航出 GridPane 中的 TextField
- c# - 在另一个图像中搜索图像,只返回部分结果