一些内存似乎在malloc()和free()之后被分配

我是C新手。我试图让malloc +免费。 我编写了下面的测试代码,但由于某种原因,内存未完全释放(最高仍然表示分配给进程的内存大约为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

top会告诉你分配给你的进程的物理内存的数量。 虚拟内存是物理内存的抽象,而malloc / free提供了抽象。

malloc从您的程序堆中保留空间。 堆只是您程序的虚拟地址空间用于临时存储的区域。 当你更多地调用malloc ,堆使用brk系统调用进行扩展。 但是,虽然堆的虚拟大小会增加,但直到您读取或写入新分配的内存时才会分配物理内存。 例如,由于您从不写入分配给记录inner字段的内存,这些分配不会占用任何物理RAM。

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


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

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


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

链接地址: http://www.djcxy.com/p/80395.html

上一篇: Some memory seems to be left allocated after malloc() and free()

下一篇: Does calling free or delete ever release memory back to the "system"