Проблема с использованием malloc в связанных списках - PullRequest
1 голос
/ 02 июня 2010

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

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

table *head;
table *current = head;

После окончания функции, если я использую бесплатно

free(current);
current = NULL:

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

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

1 Ответ

2 голосов
/ 02 июня 2010

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

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

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

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

...