Проблема с использованием malloc в связанных списках

Я работал над этой программой в течение пяти месяцев теперь. Это - приложение реального времени сенсорной сети. Я создаю несколько связанных списков во время срока действия программы, и я использую malloc для создания нового узла в ссылке. То, что происходит, - то, что программа внезапно останавливается или сходит с ума и перезапускает. Я использую AVR, и микроконтроллер является 1281 ATMEGA. После большой отладки я выяснил, что это malloc вызывает проблему. Я не освобождаю память после выхода из функции, которая создает новую ссылку, таким образом, я предполагаю, что это в конечном счете заставляет память "кучи" переполняться или что-то как этот. Теперь, если я использую свободное () функция для освобождения памяти в конце функции с помощью malloc, программа просто застревает, когда управление достигает свободный (). Это вызвано тем, что память становится слишком кластеризованной после вызова свободного ()?

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

table *head;
table *current = head;

После конца функции, если я использую свободный

free(current);
current = NULL:

Затем программа застревает здесь.

Я не знаю, что сделать. Что я делаю неправильно? Существует ли способ увеличить размер памяти "кучи"?

1
задан Abhinav 27 October 2010 в 03:31
поделиться

1 ответ

Необходимость освобождения блока в конце функции, вызывающей malloc (), зависит от того, должна ли память блок все еще используется после вызова. Если он становится узлом в списке, вы должны не освобождать его в конце функции. Если она используется для временной рабочей памяти во время вызова, вы должны освободить ее в конце, иначе вы в конечном итоге исчерпаете свою кучу. Вы должны освободить блок, когда он будет удален из списка.

В любом случае использование malloc () и free () для небольших блоков памяти (т. Е.связанных списков) в системе реального времени (без виртуальной памяти) приведет к возможной фрагментации кучи.

Что вам нужно сделать, так это использовать пул блоков памяти и перезапустить буферы. Вы используете ОСРВ или это голый металл? Если вы посмотрите, есть существующие библиотеки пула памяти. Вы также можете написать одну, но относительно легко создать что-то похуже, чем отсутствие библиотеки, если вы не имеете большого опыта в этой области.

Предоставьте более подробную информацию, если вам нужен более конкретный совет.

2
ответ дан 3 September 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: