Утечка памяти (структура данных стека / связанного списка) - PullRequest
0 голосов
/ 26 мая 2020

довольно понятно. Мне нужна помощь в решении проблемы с утечкой памяти. Обратите внимание на коды и скриншоты ниже. Я рад ответить на любые дополнительные вопросы или уточнить больше :)

Мне поручено построить структуру данных стека (LIFO). При этом у меня возникают проблемы с освобождением кучи памяти, которую я mallo c. Я использую mystack.h в качестве файла заголовка и main. c для тестирования моей программы. Оба требования. V.Imp: Мне не разрешено изменять подпись какой-либо функции.

1 Ответ

2 голосов
/ 26 мая 2020

В функции stack_enqueue у вас есть две строки:

node_t *n = (node_t*)malloc(sizeof(node_t));
s->head[s->count++] = *n;

Первая строка динамически выделяет память. Вторая строка копируется туда, куда указывает n. Затем вы просто отбрасываете указатель n и память, на которую он указывает. Это действительно утечка памяти.

Простое решение - добавить:

free(n);

после назначения.

Есть небольшая проблема с этим и всем вашим списком «реализация, потому что то, что у вас есть, на самом деле не список, а простой массив структурных объектов. Вы можете заменить соответствующие строки stack_enqueue на, например:

s->head[s->count++].data = item;

, а затем вообще не беспокоиться о части списка (по сути, удалите элемент next структуры вместе со всей обработкой «списка» ).


Думаю, вы неправильно понимаете цель упражнения. Если s->head является указателем, его следует рассматривать не как массив, а как указатель на первый узел списка.

Таким образом, у вас будет что-то вроде

+---------+    +------------+    +-------------+           +-----------+
| s->head | -> | first node | -> | second node | -> ... -> | last node | --> NULL
+---------+    +------------+    +-------------+           +-----------+

То есть , s->head указывает на первый узел. Указатель первого узла next указывает на второй узел, et c.

В вашем текущем коде нет такой привязки узлов.

Если у вас есть проблемы с пониманием связанных списков, ваши учебники должны содержать информацию об этом, и ваш класс также должен был поднять это. И во всем Inte rnet должны быть миллионы ресурсов о том, как реализовать списки ручных дескрипторов.

...