2011-11-12 130 views
2

我有一個關於我的代碼的簡短問題。我已經創建了兩種情況或用於測試的示例。C內存免費混淆

例1:

char *arr[1000000]; 
int i = 0; 
for (; i < 1000000; i++){ 
    char *c = (char *) calloc(1, sizeof(char) * 10); 
    free(c); 
} 

例2:

char *arr[1000000]; 
int i = 0; 
for (; i < 1000000; i++){ 
    char *c = (char *) calloc(1, sizeof(char) * 10); 
    arr[i] = c; 
    free(arr[i]); 
    arr[i] = NULL; 
} 

在實施例中的型動物:將在陣列free'ing存儲器之前。

當我運行例如1這是免費的所有內存。當我運行示例2時,它不釋放所有內存。 我已經搜查,但看不出來。

爲什麼是實施例2不同,則實施例1的結果?

我的常識告訴我,例如1和2應該導致同樣的,但在實踐中並非如此。我使用linux top來檢查內存使用情況。

+6

你怎麼知道它不釋放所有內存? – EricSchaefer

+0

你是如何推斷第二個例子沒有釋放所有內存的? – Joe

+0

你檢查了什麼?過程的RSS? – wildplasser

回答

3

它是由需求造成的分頁。該進程具有數組的地址空間(即:存在可分頁條目),但沒有附加內存(尚)。循環指定(最終)屬於數組[]的所有內存頁面,因此在循環結束時,所有頁面都已「故障」。

由於概念證明,可以用替換循環:

for (; i < 1000000; i++){ 
    arr[i] = "hello, world!"; 
} 

而結果可能會是(幾乎)相同片段#2

4

結果是一樣的。我不知道你爲什麼認爲有差異。

+0

我的內存使用情況顯示不同的值 –

+0

@Tim如何檢查內存使用情況? –

+0

@etienne:linux top –

3

兩者都是一樣的。

由於您使用top讀取內存的差別可以用編譯器優化來解釋。例如,示例1中的數組可以完全優化。

爲了檢查內存問題,您應該使用Valgrind的或類似的工具。