插入排序链表中的内存泄漏

Memory leak in insert in sorted linked list

我使用了我的教授提供的一个函数,该函数在排序的链表中插入数据(整数)。

void sorted_insert(int x,node_t **list)
{
  node_t *q = NULL, *pq = NULL, *new_node = NULL;

  q = *list;

  while (q && x > q->data)
  {
    pq = q;
    q = q->next;
  }

  new_node = malloc(sizeof(node_t));
  new_node->data = x;
  new_node->next = q;

  if (!pq) { *list = new_node; }
  else { pq->next = new_node; }

}

主要来电:

node_t *list = NULL
sorted_insert(x,&list);

我已经通过将 100 个随机整数保存到 来测试它并且它正在做预期的事情,因为数字是排序的。后来我使用了一个自定义的释放函数来释放每个节点,像这样:

void free_list(node_t *list)
{
  node_t *tmp = NULL;

  for (; list; list = list->next)
  {
    tmp = list;
    free(tmp);
  }
  return;
}

然而,当我用 valgrind 分析程序时,它显示我在函数 sorted_insert 中泄漏内存,准确地说,在这一行: new_node = malloc(sizeof(node_t));

Valgrind 输出:

==9478== 160 (16 direct, 144 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==9478==    at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==9478==    by 0x109270: sorted_insert (list_insert_sorted.c:23)
==9478==    by 0x10938D: main (list_insert_sorted.c:55)

为什么会这样?我的免费功能有问题吗?提前谢谢你。

编辑: 我已经更改了 for 循环,即使我没有跳过节点,我仍然在泄漏内存。

你的自由迭代器正在跳过节点,你的循环体有 list=list->next,迭代器也是,所以它发生了两次。你很幸运,你有偶数个节点,如果你有一个奇数,避免取消引用 NULL 指针。

void free_list(node_t *list)
{
  node_t *tmp = list;

  while(tmp)
  {
    list = list->next;
    free(tmp);
    tmp = list;
  }
  return;
}

然后您编辑了代码以删除重复的迭代器,但是在您编辑的代码中,在 free(tmp) 之后,list 指向的内存不再有效(与 [=14= 相同的地址) ] 毕竟),并且您编辑的代码取消引用 list 在迭代器中指向的刚刚释放的内存,所以试试我写的。