2013-07-29 78 views
1

我使用malloc分配內存:動態內存分配在for循環

main() 
{ 
    int *array; 
    int i; 
    for(i = 0; i<40; i++) 
    { 
    array = malloc(100 * sizeof(int)); 
    } 
    free(array); 
} 

這應該分配15.625KB,但如果我在valgrind執行與此相同,峯值內存15.92KB
它是怎麼來的?

如何釋放所有40個指針?

+2

堆碎片可能 – EdH

+1

我認爲分配了400多個字節,即每個malloc調用應該分配408個字節。也許像next/prev指針這樣的內部堆數據? – bkausbk

+7

您的代碼包含一個錯誤:您必須保持malloc返回的每個指針並單獨釋放該指針。你只是釋放最後一個指針。這會導致先前分配的39個指針導致內存泄漏。 – CouchDeveloper

回答

4

malloc總是分配多一點比你要求的,必要的內部覈算,造成碎裂等

在最低限度 - 需要每個分配塊的大小保存在某個地方,往往是一些指針(例如到下一個分配/空閒塊)也被存儲,並且在某些情況下(例如,調試版本)也存儲額外的調試信息。大多數實現在未分配的空間中存儲儘可能多的信息,因此在每個分配的塊中僅存儲幾個字節(例如大小)。關於碎片,許多實現具有最小的分配大小,或者舍入所需的大小以保持某種對齊。

0

當你調用malloc(),實際使用的內存量是比什麼是稍微requested.This額外包括記錄塊有多大的信息,哪裏是下一個可用的空閒塊等

這額外的信息是free()函數知道要釋放多少的原因。

1

關於釋放所有40個指針,你可以例如有一個指針數組來保存從malloc返回的指針,並在函數結尾處遍歷指針。

東西沿着線:

main() 
{ 
    int *arrays[40]; 
    int i; 
    for(i = 0; i<40; i++) 
    { 
    arrays[i]=malloc(100 * sizeof(int)); 
    } 

    for(i = 0; i<40; i++) 
    { 
    free(arrays[i]); 
    } 
} 
+0

對不起,我無法理解C++ –

+0

切換到C示例 – Ofir

1

免費(數組)應該是在循環內釋放所有的指針,而不是隻有最後一個。