C语言 如何在链表中释放堆中的内存而不导致内存泄漏

umuewwlo  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(170)

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

void free_listint(listint_t *head)
{
    listint_t *temp;
     
    temp = head;
    while (head != NULL)
    {
         free(head);
         temp = temp->next;
    }
    return;
}
smdnsysy

smdnsysy1#

你的while循环会检查head,但是head在循环中不会被重新分配。这可能会导致无限循环,temp = temp->next;最终可能会崩溃。
我建议改写为

void free_listint(listint_t *head)
{
    listint_t *temp;
     
    while (head != NULL)
    {
         temp = head->next;
         free(head);
         head = temp;
    }
    return;
}
zxlwwiss

zxlwwiss2#

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

相关问题