4

我是 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
4

3 回答 3

11

top将告诉您分配给您的进程的物理内存量。虚拟内存是物理内存之上的抽象,并且malloc/free在其之上提供抽象。

malloc从程序堆中保留空间。堆只是程序的虚拟地址空间用于临时存储的区域。当您调用更多时,使用系统调用malloc扩展堆。brk但是,尽管堆的虚拟大小增加了,但在您读取或写入新分配的内存之前,并未实际分配物理内存。例如,由于您从不写入分配给inner记录字段的内存,因此这些分配不会占用任何物理 RAM。

free只是释放由malloc. 这并不一定会减少堆的虚拟大小,因此与其关联的物理内存可能不会被释放。这就是为什么您没有看到物理内存使用量减少的原因。

于 2009-11-14T21:39:13.030 回答
6

Unix内存管理是懒惰的,除非有人真的不需要它,否则不能保证释放进程内存。这是一篇好文章。

另外我建议您检查 malloc() 结果,您肯定会发现其中至少有一些失败了。

于 2009-11-14T21:28:37.563 回答
3

可能是由于您分配了 10000000000000000 字节 (1000*10000*1000*1000*1000) =~ 10000000000 Mbytes = 10000000 GB 的顺序,这会多次包裹您的系统内存。

于 2009-11-14T21:24:49.053 回答