我正在做一些分配和释放内存的测试。这是我正在使用的代码:
#include <stdlib.h>
#include <stdio.h>
#define WAVE_SIZE 100000000
int main(int argc,char* argv[]){
int i;
int **p;
printf("%d allocs...\n",WAVE_SIZE);
// Malloc
printf("Allocating memory...\n");
p = (int**)malloc(WAVE_SIZE*sizeof(int*));
for(i = 0;i < WAVE_SIZE;i++)
p[i] = (int*)malloc(sizeof(int));
// Break
printf("Press a key to continue...\n");
scanf("%*s");
// Dealloc
printf("Deallocating memory...\n");
for(i = 0;i < WAVE_SIZE;i++)
free(p[i]);
free(p);
// Break
printf("Press a key to continue...\n");
scanf("%*s");
return 0;
}
在休息期间,我检查过程使用的总内存,但我看不到我期望的内容。
直到第一次暂停,我看到内存消耗增加。但是,在第二次暂停时我没有看到它被释放。
这是OS的事吗?如果我的机器负载很高,我没有空闲内存而另一个进程尝试分配会怎样?
答案 0 :(得分:8)
free
不一定会将内存释放回操作系统。大多数情况下,它只是将内存区域放回到空闲块列表中。这些空闲块可以在下次调用malloc
时重复使用。
答案 1 :(得分:5)
当分配内存并稍后释放时,该内存仍然保留在进程中但被标记为空闲,因此可以再次分配。这是因为每次调用malloc
或free
时操作系统都必须更改进程的虚拟内存映射,这需要时间。
答案 2 :(得分:1)
实际释放系统内存取决于操作系统。
Windows中的敌人示例,即使您关闭程序,内存也不会同时释放。它是为了在下一个程序启动时重复使用它。
答案 3 :(得分:1)
free()
只告诉分配器你的程序不再需要这个块。分配器可以将其缓存以供进一步分配,或者可以通过更改brk
指针将其返回到系统。这一切都取决于实施。