如何在链表中释放内存而不泄漏堆中的内存

How to free memories in the heap without getting memory leak in linked list

提问人:Stanley 提问时间:3/30/2023 最后编辑:Some programmer dudeStanley 更新时间:3/30/2023 访问量:68

问:

我编写了一个函数,该函数将在链表中处理内存释放,但该函数能够释放它们,但我得到了内存泄漏。请有人告诉我为什么这个功能能够释放我的内存,但内存泄漏。

void free_listint(listint_t *head)
{
    listint_t *temp;
     
    temp = head;
    while (head != NULL)
    {
         free(head);
         temp = temp->next;
    }
    return;
}
c malloc 单一链接列表

评论

2赞 Some programmer dude 3/30/2023
while (head != NULL)?在循环中的哪个地方,你在其他地方提出观点?你有一个无限循环,列表将用完,你将取消引用空指针。这会导致未定义的行为和可能的崩溃。head
0赞 Karthick 3/30/2023
你的头永远不会在循环内移动。
0赞 Stanley 3/31/2023
哦,谢谢。@Karthick我以为我的头部指针指向第一个节点,而第二个指针在列表中循环。因为头指针指向第一个节点的地址,当第二个指针存储临时地址时,不应重新分配该节点以避免丢失地址。
0赞 Karthick 3/31/2023
右。 不适用于此函数,因为您将删除整个列表。should not be reassigned to avoid losing the address

答:

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.
}