Мало вещей:
- Где вы выделяете память для
dictionary
?
- Как вы распределяете память, на которую указывает
dictionary->addr
? Без кода для malloc
не будет видно, будет ли работать free
.
- Если в вашей функции
malloc
вы не просматриваете каждый адрес памяти, доступный процессу, чтобы проверить, не используется ли он вашим dictionary
, простое назначение dictionary[i].addr=NULL
не "освободит" память и определенно не хранить его для повторного использования.
Кстати, функция printf
в вашей версии free
будет печатать Remember to free!
, когда пользователь бесплатно вызывает указатель, который предположительно не выделен, верно? Тогда почему "не забудьте освободить"?
Изменить:
Так что с этой функцией malloc
нет, ваш free
не освобождает память. Прежде всего, вы теряете адрес памяти, поэтому каждый раз, когда вы называете это malloc
, вы фактически продвигаете процесс прерывания немного дальше и никогда не используете повторно освобожденные области памяти. Один из способов решения этой проблемы состоит в том, чтобы как-то отслеживать местоположения, которые вы «освободили», чтобы в следующий раз, когда вызывается malloc
, вы могли проверить, достаточно ли у вас памяти, уже выделено процессу, и затем повторно использовать эти местоположения. Кроме того, помните, что sbrk
является оберткой вокруг brk
, который является дорогим системным вызовом, вы должны оптимизировать свой malloc
так, чтобы большая часть памяти запрашивалась из ОС с использованием sbrk
, а затем просто отслеживать, какие часть, которую вы используете, и какая часть доступна.