Освобождение двусвязного списка - зависает - PullRequest
1 голос
/ 16 октября 2011

Я пытаюсь освободить двусвязный список. Это функция, которую я использую.

static void clean_list(particles * plist)
{

  particles  *n_list = plist;
  particles *temp_nlist;

  while(n_list){
    temp_nlist = n_list->next;

    free(n_list);
    n_list = temp_nlist;

  }
 }

Когда я пытаюсь вызвать эту функцию в моей программе, программа зависает, не возвращаясь из этой функции. Несколько замечаний: plist - это двусвязный список с prev, next, указателем на структуру, которая в свою очередь имеет int и double как данные, и сам связанный список как данные элемента. Как вы думаете, так как plist имеет указатели на другие данные, он зависает? В этом случае я даже освобождаю указатель и запускаю тот же clean_list в связанном списке, который является членом plist. Я пытался найти решение, но не нашел. Пожалуйста помоги.

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Я согласен с другими комментаторами в том, что для правильного ответа на этот вопрос требуется больше информации о начальных условиях вашей проблемы.Однако, сценарий, который приводит к сбою вашего кода, сразу приходит на ум.

Предположим, что plist является циклически связанным списком с тремя элементами: A <-> B <-> C <-> A и plist точкик A.

Когда ваш код выполняется, он будет: освобождать A, переходить к B, освобождать B, переходить к C, освобождать C, а затем переходить к освобожденной памяти, которая была A.Теперь ваш код взрывается.(или работает вечно)

Поскольку это двусвязный список, вы должны использовать свои предыдущие ссылки, чтобы обнулить свои следующие ссылки перед освобождением.И для хорошей меры, также аннулируйте свои предыдущие ссылки.

temp_nlist = n_list->next;
temp_nlist->prev = NULL;
if (n_list->prev != NULL) n_list->prev->next = NULL;

free(n_list);
n_list = temp_nlist;
0 голосов
/ 17 октября 2011

Вероятно, это проблема не самой функции, а ее остатков, указателей head, tail или prev, которые не были очищены.

Пожалуйста, попробуйте выполнить вашу программу в gdb, дайте ей сбой ипосмотрите на обратный след (bt).Я уверен, что это даст вам лучшее понимание того, что происходит.После того, как у вас есть трассировка, пожалуйста, опубликуйте ее с некоторым кодом.

...