假设我有一个标准的链表结构如下:
struct Linked {
int data;
Linked* next;
}
我通过calloc
next
指针在一个循环中创建了一堆足够的内存来存储另一个Linked
并初始化它。根据链表的规范,我只维护一个指向第一个节点的指针,如下所示:
struct Linked *first = make_list();
现在,我想释放整个列表所占用的内存。我可以打电话吗
free(first);
并让它释放所有内存(包括分配给所有next
指针的内存),或者我是否必须从最后向后执行释放?
答案 0 :(得分:7)
每次拨打free()
时,都必须拨打calloc()
一个电话。因此,您需要使用循环依次释放列表中的每个元素。您可以选择向后或向前进行释放,但您可能会发现前锋更容易:
void freelist(struct Linked *head)
{
while (head != NULL) {
struct Linked *tmp = head;
head = head->next;
free(tmp);
}
}
注意(这很重要)您必须在释放节点之前阅读head->next
的值。