У меня есть двойной список в C, и я смущен относительно того, как я должен его освобождать. Я понимаю, что мне нужно пройти список, освобождающий каждый узел. Там, где запутанность заключается в том, что каждый из моих узлов имеет указатель на некоторые другие данные, и я не уверен, как я должен освободить это.Бесплатный двойной список в C
Моего двусвязный список выглядит следующим образом:
typedef struct Node_ Node;
typedef struct List_ List;
struct Node_ {
void *data;
Node *next;
Node *prev;
};
struct List_ {
Node *firstNode;
Node *lastNode;
};
Чтобы освободить список, который я создал функцию, называемую List_free(), которая пересекает список освободив каждый узел с Node_free(). Эти функции выглядят следующим образом:
void *List_free(List *list)
{
Node *next = list->firstNode;
while(next)
{
Node *node = next;
next = node->next;
Node_free(node);
}
free(list);
}
void Node_free(Node *node)
{
free(node->data);
free(node);
}
Где это будет падать вниз, где node-> данные указатель на другую структуру, которая сама содержит указатели. В моем случае я использую один и тот же код для хранения двух разных структур.
Как я вижу это у меня есть следующие варианты:
- Создать списки, где узлы держат конкретные данные. Не очень многоразовый.
- Найдите другой способ отслеживания указателей внутри данных узла.
Я думаю о правильных строках или пропустил что-то очевидное? Это моя первая попытка на C, поэтому я не удивлюсь, если все это будет совершенно неправильно.
Хм ... Я бы использовал C++ и полагался на деструкторы. –
Удачи, написав вашу ОС или драйвер ядра или встроенное приложение на C++ ;-) – 2010-11-03 11:12:03
@ Александр Рафферти: Если вы собираетесь менять язык, чтобы обойти проблему, перейдите на один с сборщиком мусора, например. Ява. – JeremyP