提问人:Stanley 提问时间:3/30/2023 最后编辑:Some programmer dudeStanley 更新时间:3/30/2023 访问量:68
如何在链表中释放内存而不泄漏堆中的内存
How to free memories in the heap without getting memory leak in linked list
问:
我编写了一个函数,该函数将在链表中处理内存释放,但该函数能够释放它们,但我得到了内存泄漏。请有人告诉我为什么这个功能能够释放我的内存,但内存泄漏。
void free_listint(listint_t *head)
{
listint_t *temp;
temp = head;
while (head != NULL)
{
free(head);
temp = temp->next;
}
return;
}
答:
3赞
Karthick
3/30/2023
#1
while 循环检查头部,但头部永远不会在循环内重新分配。这可能会导致无限循环,并可能最终崩溃。temp = temp->next;
我建议重写
void free_listint(listint_t *head)
{
listint_t *temp;
while (head != NULL)
{
temp = head->next;
free(head);
head = temp;
}
return;
}
2赞
Fe2O3
3/30/2023
#2
@Karthick显示了 OP 的错误和一个解决方案。(信用!
为了好玩,以下扫描可能会稍微容易一些:
void free_listint( listint_t *head )
{
while( head )
{
// strive to limit the scope of variables
listint_t *del = head;
head = head->next;
free( del );
}
// return; // this is unnecessary. write less code.
}
评论
while (head != NULL)
?在循环中的哪个地方,你在其他地方提出观点?你有一个无限循环,列表将用完,你将取消引用空指针。这会导致未定义的行为和可能的崩溃。head
should not be reassigned to avoid losing the address