我有一个计算链表大小的函数。我得到了一个双重免费或腐败的'当返回前的行被排除temp=NULL
时,编译错误,我只会free(temp)
。当我在temp=NULL
之前添加free(temp)
时,代码有效。
我是否因为编译器释放temp
及其链接的节点而获得双重免费或损坏? temp=NULL
会解决这个问题吗?
最终,是否有必要将free()
用于这么小的功能?
typedef struct node{
int a, b;
struct node *next;
}Node;
typedef struct list{
Node* head;
Node* tail;
}List;
int list_size(List *q){
Node *temp;
int i = 1;
if(q->tail == NULL && q->head == NULL){
return 0;
}
else{
temp = q->head;
while(temp->next != NULL){
temp = temp->next;
++i;
}
temp = NULL;
free(temp);
return i;
}
}
答案 0 :(得分:5)
您没有分配任何内存,因此您不需要释放任何内存。无论如何,如果你分配内存,你需要释放它。
需要释放的内存是动态分配的内存。动态分配内存的函数在文档中免费列出:http://en.cppreference.com/w/c/memory/free
答案 1 :(得分:2)
作为一种正确的编程技术,你应该始终free()
动态分配的内存,无论我们谈论的是多少内存。
但是,这里没有为temp分配任何内存。因此,您的问题已解决,因为您将temp设置为NULL并实际释放NULL,这不会影响您的程序。