C free(temp)释放队列的后部。我该如何释放它

C free(temp)释放队列的后部。我该如何释放它,c,pointers,queue,C,Pointers,Queue,好的,我有一个打印队列的函数。我使用一个临时节点来遍历链表。 当我尝试释放临时节点时,它也会释放队列后部(队列中的最后一个节点) 我有一个很长的算法,如果我不释放临时我将有几十万垃圾内存。而且我负担不起它规则是每个malloc一个free,因为您没有为临时节点分配空间(只是一个指向前面的指针),您不必调用free,只需忽略它。在我看来,您误解了free(temp)正在做的事情 free(temp)将不freetemp而是将temp指向的节点释放出来 循环后,temp指向列表中的最后一个节点,因此

好的,我有一个打印队列的函数。我使用一个临时节点来遍历链表。 当我尝试释放临时节点时,它也会释放队列后部(队列中的最后一个节点)


我有一个很长的算法,如果我不释放临时我将有几十万垃圾内存。而且我负担不起它

规则是每个
malloc
一个
free
,因为您没有为临时节点分配空间(只是一个指向前面的指针),您不必调用
free
,只需忽略它。

在我看来,您误解了
free(temp)
正在做的事情

free(temp)
free
temp
而是将
temp
指向的节点释放出来

循环后,
temp
指向列表中的最后一个节点,因此调用
free(temp)
释放最后一个节点。您的链接列表将被破坏,因为最后一个节点之前的节点现在指向自由对象

第二个误解似乎是,
temp
需要免费。它没有

temp
是一个具有自动存储持续时间的对象(也称为局部变量)。当函数返回时,它将自动销毁

比如:


首先是如何分配的?我不清楚
temp
指向最后一个节点,因此它会释放最后一个节点。您期望什么?如果不想删除最后一个节点,只需删除行
free(temp)
temp
本身是一个具有自动存储持续时间的变量,因此您无需“释放”
temp
。它将被自动销毁。谢谢你的回答。我的valgrind给了我一个错误,因为我的队列最后没有被释放。我以为是因为临时工,但我错了。我意识到valgrind错误是由于最后没有释放队列。我以为这是个问题,但我错了。谢谢你的回答
struct QNode *temp = q->front;

printf("Queue: %d", temp->value);
while (temp->next != NULL)
{
    temp = temp->next;
    printf(" -> %d", temp->value);
}
printf("\n");

free(temp);
void printList(...)
{
    struct QNode *temp = q->front;  // temp is just a local variable

    printf("Queue: %d", temp->value);
    while (temp->next != NULL)
    {
        temp = temp->next;
        printf(" -> %d", temp->value);
    }
    printf("\n");

    // free(temp);   Don't call free on temp
    //               temp will be automatically destroyed once the function completes
}