【问题标题】:confused over the usage of free () in C对 C 中 free() 的使用感到困惑
【发布时间】:2014-04-12 14:02:44
【问题描述】:

这是由比我更擅长 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);
    }
}

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

提前致谢。

【问题讨论】:

  • 你必须freemalloc的每一件事。
  • 您对链表的理解程度如何?这里有一个简短的解释或一个很长的解释......
  • 记住每个分配操作都应该反过来。查看将节点添加到列表的实现 - 这应该会给你一个线索。
  • 实际上,每个分配操作都应该反过来除非你把房子拆了,平台会帮你做。在后一种情况下它很忙,虽然可能有用用于泄漏检测。扩展该主题,如果您知道您的应用程序在其整个生命周期(必须很短)中永远不会分配太多内存,则所有释放都可以推迟到退出。这也允许更有效地实现内存分配器。
  • @SanJacinto:听说过未来的折扣吗?现在让你的程序变得更快、更简单、更便宜,比为模糊的未来工作更有价值,在这种未来你可能最终在某些情况下想要将它转换为恶魔或库。

标签: c memory-management linked-list


【解决方案1】:

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

【讨论】:

  • 谢谢!!!!我假设 free() 将获取指针并追踪所有节点并释放所有节点。
【解决方案2】:

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

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

第一个*,即头部,是你只是做“free ll” 这将在内存中

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

这里的问题是,您要求这些节点的所有“内存”仍然存在,现在您无法知道每个 malloc 需要的内存在哪里(您没有指向该内存)免费(不是 100% 正确,但对于简单的事情有效)。

该算法的作用是:

  1. 获取对下一个节点的引用(如果您不这样做并释放该节点,您将无法获得“下一个”节点,因为 head 将指向任何内容)。
  2. 释放头部。
  3. 将 head 指向您之前获得的参考。

【讨论】:

    【解决方案3】:

    您可以单独使用以下结构

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

    但是每次你必须声明一个全局变量struct node *HEAD。在更大的程序中,它可能会让您感到困惑。作者这样做是为了让你可以创建一个像变量一样的链表。每次你必须创建一个新的链表时,你所要做的就是声明

    LinkedList *ll;
    

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2018-01-11
        • 2011-06-10
        • 2013-07-28
        • 1970-01-01
        • 2014-07-23
        相关资源
        最近更新 更多