为啥 free() 并没有真正释放内存?

Posted

技术标签:

【中文标题】为啥 free() 并没有真正释放内存?【英文标题】:Why free() doesn't really frees memory?为什么 free() 并没有真正释放内存? 【发布时间】:2013-02-28 15:31:46 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

free() 只是告诉分配器你的程序不再需要这个块。分配器可以缓存它以供进一步分配,也可以通过更改brk 指针将其返回给系统。这一切都取决于实现。

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于为啥 free() 并没有真正释放内存?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们要在 free() 释放内存后清空指针? [复制]

为啥 free() 不释放所有分配的内存位置? [复制]

在C语言进行编程中,为啥要释放旧内存?

绝不能对非动态分配存储块使用free,也不能对同一块内存区同时用free释放两次,为啥?free函数原理是?

linux内存管理及手动释放机制

为啥free函数不在释放内存后,将指针置NULL,野指针有啥用