混淆了C中free()的用法

时间:2014-04-12 14:02:45

标签: c memory-management linked-list

这是由比C更好的C编程人员完成的。

对C

中free()的使用感到困惑

下面是链表的结构

typedef struct node {
    int value;
    struct node *next;
} ListNode;

typedef struct list {
    ListNode *head;
} LinkedList;

创建包含某些节点的列表后

他的代码在退出时执行此操作

void deleteList(LinkedList *ll) {
    if (ll != NULL) {
        ListNode *temp;
        while (ll->head) {
            temp = ll->head;
            ll->head = temp->next;
            free(temp);
        }
        free(ll);
    }
}

以上是我不明白的。为什么他需要创造这样的复杂性,为什么不做自由(ll)。 请帮忙

提前感谢。

4 个答案:

答案 0 :(得分:3)

链接列表由碰巧指向彼此的单个对象组成。如果要删除列表,则必须删除其所有节点。 free()不会这样做。它不知道这些对象构成一个列表。它甚至不知道这些对象包含指向任何东西的指针。因此,您需要手动迭代列表和free每个节点。

答案 1 :(得分:3)

如果你有一个链表,那么每个“*”都是一个节点。

        0  1  2  3  4
head--> *--*--*--*--*

第一个*,头部,你只是做“免费ll” 这将在记忆中

        0   1  2  3  4
head-->nul  *--*--*--*

这里的问题是,你要求这些节点的所有“内存”仍然存在,现在你不知道你需要的每个malloc它在哪里(你没有任何东西对那个内存有任何影响)免费(不是100%正确,但对于简单的工作)。

该算法的作用是:

  1. 获取对下一个节点的引用(如果你不这样做并且你释放了节点,你将无法获得“下一个”节点,因为head将指向什么都没有)。
  2. 释放头部。
  3. 使头部指向您之前获得的参考。

答案 2 :(得分:1)

您可以单独使用以下结构

typedef struct node {
    int value;
    struct node *next;
} ListNode;

但每次你必须声明一个全局变量struct node *HEAD。在更大的计划中,它可能会让您感到困惑。作者已完成此操作,以便您可以创建类似变量的链接列表。每次你必须创建一个新的链表时,你所要做的就是声明

LinkedList *ll;

当有两个结构时,必须释放struct的对象。

答案 3 :(得分:0)

那是因为每个指针都指向一个内存位置。您需要释放先前分配的所有内存位置。 free(ll)只会删除ll指针指向的节点。