【问题标题】:2 ways of freeing memory of a simple linked list in C?2种释放C中简单链表内存的方法?
【发布时间】:2012-03-20 21:31:23
【问题描述】:

*强文本*我在 C 语言中创建了一个名为 lon 的链表,并借助以下函数:

struct ilist_node {
   struct ilist_node * rest;
   int first;
};

typedef struct ilist_node *ilist;


ilist icons(int in, ilist il) {
   ilist r = malloc(sizeof(struct ilist_node));
   r->first = in;
   r->rest = il;
}

然后我用 icons 增加列表以创建数字列表

之后,我尝试打印列表中的每个元素并释放列表使用的内存

while (lon!= NULL) {
      ilist tmp = lon->rest;
      printf(" %d\n",lon->first);
      free(lon);
      lon = tmp;
   }

我可以理解为什么上面的这个函数有效。 (我用谷歌搜索了如何释放内存,这似乎是流行的答案)。但出于好奇,我又试了一个:

   ilist tmp = lon;
   while (lon != NUll) {
      printf(" %d\n",lon->first);
      lon = lon->rest;
   }

   idelete(tmp);

它也有效。所以我有点困惑。如果最后一个有效,那为什么我需要遍历列表并释放每个节点?

【问题讨论】:

  • 目前尚不清楚您是否想要评论循环遍历列表或释放其空间。如果我认为 idelete 确实是我们需要比较的,那么请也发布 idelete 的来源
  • 啊谢谢。是的,因为我使用的是我的教授给出的idelete,而不是内置的delete。愚蠢的错误
  • 通常情况下,提出问题会有所帮助!-)
  • @user1248785:请四处看看,阅读常见问题解答,等等。不要在标题前写(solved) - 没有人这样做。如果您有足够的声誉,请接受答案(就像您所做的那样)并投票。编辑您的问题会在列表中弹出。只需使用投票系统就足够了。谢谢。

标签: c memory free


【解决方案1】:

在看到idelete 的源代码之前,我无法发表评论。 冒着成为 PITA 的风险,我认为没有人可以准确地发表评论。

我们需要idelete的来源。

idelete可能是

void idelete(ilist il) {
   while (il!= NULL) {
      ilist tmp = il->rest;
      free(il);
      il = tmp;
   }
}

这会很好。

【讨论】:

    【解决方案2】:

    如果idelete() 实现您在第一个示例中使用的语义(free()ing 在遍历列表元素时),则所有内容都应该被释放。因此,如果idelete 知道ilist 类型并且能够在内部为列表元素调用free(传递列表条目),那么您就很好,不会发生泄漏。

    但是,如果不是这种情况,我下面的原始陈述(以及其他答案)适用:


    第二个实际上只会释放最后一个/第一个元素(取决于您如何考虑链表中元素的顺序) - 您在顶部分配有 ilist tmp = lon 的那个。它可以工作,但会泄漏一些内存。

    如果这是在 Linux 或支持它的 unixoid 系统上,我强烈建议检查一下 Valgrind 及其默认工具 memcheck 对整个事情的看法,这样你可能会学到一些东西。

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 2020-12-08
      • 2020-07-17
      • 2022-01-21
      • 2016-06-22
      • 2017-06-21
      • 2014-09-11
      • 1970-01-01
      相关资源
      最近更新 更多