我是C的新手。我正在尝试使用malloc + free。我编写了以下测试但由于某种原因,内存未完全释放(顶部仍表示分配给处理的内存大约150MB)。那是为什么?
#include <stdio.h>
#include <malloc.h>
typedef struct {
char *inner;
} structure;
int main()
{
int i;
structure** structureArray;
structureArray = (structure**)malloc(sizeof(structure*)*1000*10000);
for (i = 0; i < 1000*10000;i++)
{
structureArray[i] = (structure*) malloc(sizeof(structure));
structureArray[i]->inner = (char*) malloc(sizeof(char)*1000*1000*1000);
}
printf("freeing memory");
for (i = 0; i < 1000*10000;i++)
{
free(structureArray[i]->inner);
free(structureArray[i]);
}
free(structureArray);
system("sleep 100");
return 0;
}
相应的Makefile:
all: test.c
gcc -o test test.c
./test &
top -p `pidof ./test`
killall ./test
答案 0 :(得分:11)
top
会告诉您分配给您的流程的物理内存量。虚拟内存是物理内存之上的抽象,malloc
/ free
提供了一个抽象。
malloc
从程序堆中保留空间。堆只是程序的虚拟地址空间用于临时存储的区域。当您再调用malloc
时,使用brk
系统调用扩展堆。但是,尽管堆的虚拟大小增加,但在读取或写入新分配的内存之前,实际上并未分配物理内存。例如,由于您从不写入分配给记录的inner
字段的内存,因此这些分配不会占用任何物理RAM。
free
只释放malloc
分配的堆的部分内容。这不一定会减少堆的虚拟大小,因此可能无法释放与其关联的物理内存。这就是为什么你没有看到物理内存使用量减少的原因。
答案 1 :(得分:6)
Unix内存管理是懒惰的,除非有人真的不需要它,否则不能保证释放进程内存。 Here is好文章。
另外我建议你查看malloc()结果,你肯定发现其中至少有一些失败了。
答案 2 :(得分:3)
可能是因为您分配了10000000000000000字节(1000 * 10000 * 1000 * 1000 * 1000)= ~10000000000 Mbytes = 10000000 Gbytes的顺序,它会多次包装您的系统内存。