我有一个简单的链接列表节点,如下所示
typedef struct node {
void *data;
struct ListElement *next;
} node;
我还有一个节点创建和删除功能,如下所示:
void createNode(void *data){
node *n = malloc(sizeof(node));
//assign data to data and initialize pointer to NULL
}
void deleteNode(List *list, Node *node){
//Take care of the next pointer
free(node);
}
当我释放节点时,我是否还必须删除结构的成员(数据和下一个指针)?既然我没有专门为成员使用malloc,而只是为了整个结构?如果是的话那我该怎么做?是否将节点的所有成员放在堆上,并且根本不会使用堆栈?
答案 0 :(得分:2)
最终规则:free()
malloc()
(或calloc()
或...)
data
所以:
予。如果node->next
指向由这些函数分配的东西,那么是的,你需要这样做。
II。 void free_list(Node *list)
{
while (list != NULL) {
Node *p = list->next;
// maybe:
// free(list->data);
free(list);
list = p;
}
}
将被释放(假设你正在释放整个列表),所以无论如何你需要释放它,但只有在你处理了下一个元素之后才会释放它。
迭代解决方案:
void free_list(Node *list)
{
if (list->next != NULL) {
free_list(list->next);
}
// free(list->data);
free(list);
}
递归解决方案:
{{1}}
答案 1 :(得分:1)
通常,您还需要free
成员data
,您必须在free
node
之前完成此操作,
free(node->data);
free(node);
但您不需要free
node->next
,因为要么保留列表的其余部分,要么free
整个列表,然后释放下一个是在循环的下一次迭代中完成。
如果不指向已分配(带有node->data
之类的内存),则不得释放malloc
,但这种情况很少见。
答案 2 :(得分:1)
data
不是变量,它是struct node
的成员。如果通过调用struct node
动态分配malloc()
,则会得到足够大的内存块来容纳结构的所有成员。这显然包括data
指针的存储空间,但不包括指针指向的内容的存储空间。因此,结构成员的存储不能单独释放,只需free
结构即可。
但是,由于data
本身就是一个指针,因此无法知道指向的内存在哪里,以及在我们看到它如何初始化之前是否需要释放这个内存。 / p>