插入排序链表中的内存泄漏
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
在迭代器中指向的刚刚释放的内存,所以试试我写的。
我使用了我的教授提供的一个函数,该函数在排序的链表中插入数据(整数)。
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
在迭代器中指向的刚刚释放的内存,所以试试我写的。