2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 C, вопрос про malloc
Сообщение06.01.2014, 16:40 
Предмет "Программирование в Unix", преподаватель задал вопрос, что будет, если мы сделаем:

Код:
char *a = malloc(20);
char *b = malloc(10);
free(b);
free(a);


Я читал в Робачевском, что в malloc и free используется sbrk(), то есть, у нас сдвигается брейк-адрес вверх или вниз, давая процессу память или отнимая ее. То есть, у нас дважды увеличивается количество памяти (на 20, потом на 10), потом дважды уменьшается (на 10, потом на 20).
Но что будет, если мы освободим память в другом порядке? У нас ведь не должно зависеть освобождение от порядка операций, то есть, все должно быть хорошо. Но если мы сделаем наоборот, то у нас сначала адрес опустится на 20, отгрызая лишний кусок, а потом только на 10, и все будет плохо.
То есть, на самом деле там используется другой механизм? Если да, то подскажите, пожалуйста, какой. Если нет, то помогите понять, в чем я неправ.

 
 
 
 Re: C, вопрос про malloc
Сообщение06.01.2014, 16:59 
Хранится максимальный доступный адрес (brk) и список свободных блоков памяти в пределах этого адреса. Списков может быть несколько, например для разных размеров блоков, для пущей эффективности.
Когда в конце кучи накопится некоторое количество непрерывной свободной памяти, библиотека вызовет sbrk и отдаст эту память системе, но 20 байт обычно для этого недостаточно. Это всё настраиваемо (см mallopt), и sbrk вообще может не вызываться для освобождения памяти, только для выделения.

 
 
 
 Re: C, вопрос про malloc
Сообщение06.01.2014, 17:04 
А где хранится этот список?
То есть, при free просто может новый блок быть занесен в этот список? Где-нибудь вообще можно почитать про этот механизм?

 
 
 
 Re: C, вопрос про malloc
Сообщение06.01.2014, 17:32 
Зачем? Детали реализации могут быть очень разные.
Но о некоторых свойствах знать, пожалуй, надо. Например, о том, что на информацию о блоке памяти (размер, занятость) требуется дополнительная память, так что если вы выделили 10 байт, то на самом деле свободной памяти станет меньше, например, на 24 байта.

 
 
 
 Re: C, вопрос про malloc
Сообщение06.01.2014, 17:33 
Ну чтобы хоть знать, какие возможности там бывают.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group