2013-07-29 4 views
1

Я выделения памяти с помощью malloc:Динамическое распределение памяти для цикла

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 байт, то есть 408 байт должно быть выделено за вызов malloc. Может быть, внутренние данные кучи, такие как следующий/предыдущий указатель? – bkausbk

+7

Ваш код содержит ошибку: вы должны сохранить каждый указатель, возвращенный из malloc, и освободить этот указатель в отдельности. Вы освобождаете только последний указатель. Это приводит к задержке памяти у 39 указателей, ранее выделенных. – CouchDeveloper

ответ

4

malloc всегда выделяет немного больше, чем вы просили, необходимые для внутреннего учета, вызванные фрагментации и т.д.

как минимум - размер каждого выделенного блока должны быть где-то хранить, часто некоторые указатели (например, к следующему выделенному/свободному блоку) также сохраняются, а в некоторых случаях (например, отладочные сборки) также сохраняется дополнительная информация об отладке. Большая часть реализации хранит как можно больше информации в нераспределенном пространстве, поэтому в каждом выделенном блоке будет храниться только несколько байтов (например, размер).

Что касается фрагментации, то многие реализации имеют минимально выделенный размер или округляют запрошенный размер, чтобы поддерживать какое-то выравнивание.

0

При вызове таНоса(), объем памяти фактически используется чуть больше, чем это 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

бесплатно (массив) должен быть внутри цикла, чтобы освободить все указатели вместо только последний.

Смежные вопросы