c语言 - 为什么 free() 不会真正释放内存?



我正在做一些测试分配和释放内存。这是我使用的代码:

#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;
}

在休息期间,我检查进程使用的总内存,但我没有看到我所期望的。

直到第一次暂停,我看到内存消耗增加。然而,在第二次暂停时,我没有看到它被释放。

这是操作系统的问题吗?如果我的机器负载很高,我没有空闲内存,而另一个进程试图分配,会发生什么?

free不一定会将内存释放回操作系统。大多数情况下,它只是将该内存区域放回一个空闲块列表中。这些空闲块可以在下次调用malloc时重用。

当内存被分配并稍后被释放时,该内存仍然留在进程中,但被标记为空闲,因此可以再次分配。这是因为每次调用mallocfree时,操作系统都必须更改进程的虚拟内存映射,这需要时间。

free()只是告诉分配器您的程序不再需要这个块。分配器可以缓存它以便进一步分配,也可以通过更改brk指针将它返回给系统。

系统内存实际释放时间取决于操作系统。

以Windows为例,即使你关闭了一个程序,内存也不会同时释放。这样做是为了在下次程序启动时重用它。

相关内容

  • 没有找到相关文章

最新更新