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)
将不freetemp
而是将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
}