我使用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個指針?
我使用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個指針?
malloc
總是分配多一點比你要求的,必要的內部覈算,造成碎裂等
在最低限度 - 需要每個分配塊的大小保存在某個地方,往往是一些指針(例如到下一個分配/空閒塊)也被存儲,並且在某些情況下(例如,調試版本)也存儲額外的調試信息。大多數實現在未分配的空間中存儲儘可能多的信息,因此在每個分配的塊中僅存儲幾個字節(例如大小)。關於碎片,許多實現具有最小的分配大小,或者舍入所需的大小以保持某種對齊。
當你調用malloc(),實際使用的內存量是比什麼是稍微requested.This額外包括記錄塊有多大的信息,哪裏是下一個可用的空閒塊等
這額外的信息是free()函數知道要釋放多少的原因。
關於釋放所有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]);
}
}
對不起,我無法理解C++ –
切換到C示例 – Ofir
免費(數組)應該是在循環內釋放所有的指針,而不是隻有最後一個。
堆碎片可能 – EdH
我認爲分配了400多個字節,即每個malloc調用應該分配408個字節。也許像next/prev指針這樣的內部堆數據? – bkausbk
您的代碼包含一個錯誤:您必須保持malloc返回的每個指針並單獨釋放該指針。你只是釋放最後一個指針。這會導致先前分配的39個指針導致內存泄漏。 – CouchDeveloper