【问题标题】:Is there a way to free all nodes in a linked list in one go instead of iterating through each node?有没有办法一次性释放链表中的所有节点,而不是遍历每个节点?
【发布时间】:2016-01-29 21:54:46
【问题描述】:

我有以下链接列表,其中有几个已附加到它的节点。是否可以一次释放所有笔记而不是遍历每个节点?

这是我的结构:

struct Courses{
        char *courseName;
        int creditValue;
        Courses *next;
    };Courses;

【问题讨论】:

    标签: c linked-list malloc free


    【解决方案1】:

    您可以编写自己的中间分配器来分配(例如)1000 个节点结构的大块。您可以通过一次从大块中“分配”一个节点来构建您的列表,使用一个简单的变量来跟踪您使用了多少,以及一些代码来捕捉您已经使用它们的情况起来。

    然后,当需要释放您的列表时,您可以一次性释放那一个块。

    在您的示例中,您可能还需要担心为courseName 指针动态分配的内存。你也可以处理这个问题,尽管你的中间分配器变得更加复杂,因为它最终更像是一个通用的 malloc 替换,而不仅仅是一个专用的 Courses 节点分配器。

    【讨论】:

    • 当然,要考虑到节点数量超过一个块的可能性,您需要一个数据结构——可能是一个链表——来跟踪这些块。当然,您需要迭代地遍历 that 列表。 (或者把它都拉上一层。或者两层....)
    • @John Bollinger 公平地说,OP 问道“有没有办法让...一次性释放...?”这个答案确实提供了一个的答案,包括它的缺点。 OP应该使用这种方法吗?可能不会,但取决于 OP 未说明的许多事情。
    • @JohnBollinger 当然,但我通过说“一些代码来捕捉你已经用完它们的情况”(暂时)把它扫到了地毯下。 OP 看起来像是在编写玩具程序;我打赌 1,000 个节点就足够了。如果不是,他可能会自己弄清楚,或者要求澄清。就我自己而言,我已经使用过这种技术,多次释放块的链接列表。 (在我自己的情况下,我从来没有强加过要释放的块的链表使用相同的代码,或者具有与顶级数据结构相同的“一次性释放”要求。)
    • 当然,我不是说你错了。我只是指出这是一种特殊情况的解决方案,而不是一般的解决方案,即使特殊情况可以做得很大。问题的唯一真正通用的解决方案(在 C 中)涉及终止程序......事实上,我确定我在过去几天内回答了一个几乎相同的问题。
    【解决方案2】:

    没有。除了迭代列表之外别无他法。

    在现代操作系统上,分配的内存将在进程退出后由操作系统回收。所以你可以避免自己释放()。但这不是一个好的选择,特别是如果程序是一个长时间运行的程序,或者它也不是一种通用的释放内存的方法。

    【讨论】:

    • 但这会导致 Valgrind 仍然弹出警告吗?
    • 是的。 Valgrind 会抱怨内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2016-04-20
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多