2013-02-28 74 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指針將其返回給系統。這一切都取決於實施。