2013-02-28 72 views
2

我正在做一些测试分配和释放内存。这是我正在使用的代码:为什么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; 
} 

在休息期间我检查过程中使用的总内存,我没有看到我的预期。

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

这是一个操作系统的东西?如果我的机器负载很高,会发生什么情况,我没有可用内存,另一个进程尝试分配?

回答

7

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

5

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

1

当系统内存将被实际释放取决于操作系统。

敌人在Windows中的例子,即使你关闭一个程序,内存不会同时释放。它是为了在下一次程序开始时重用它而制作的。

1

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