我使用了教授提供的一个函数,该函数在排序的链表中插入数据(int(。
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
指向的内存不再有效(毕竟与tmp
的地址相同(,并且编辑的代码在迭代器中取消引用list
指向的刚刚释放的内存,所以请尝试我所写的内容。