我在C中实现了一个链表。在阅读了我已更新的注释后,提供了更多代码,调用free()。如果我运行下面的代码,我会得到以下错误"双重免费或损坏(fasttop):"我坚信这会出现free_list,这可能是错误的。如果我跑
valgrind --leak-check = full --show-leak-kinds = all
我将收到以下错误"总堆使用量:4个分配,7个释放,64个字节分配"
list_t* xmalloc(size_t size){
list_t * t = malloc(size);
if(t == NULL){
fprintf(stderr, "out of memory\n");
}
return t;
}
/* a function new_list to create a new and empty list.*/
list_t* new_list(void){
list_t* stack;
stack = xmalloc(sizeof(list_t));
stack->value = NULL;
stack->succ = NULL;
return stack;
}
/* a function free_list to deallocate the list.*/
void free_list(list_t* head){
list_t* temp;
temp = head;
while(head->succ != NULL){
temp = head->succ;
head->succ = head->succ->succ;
free(temp);
}
free(head);
}
void insert_first(list_t* list, int* a){
list_t* t;
t = new_list();
t->value = a;
t->succ = list->succ;
list->succ = t;
free(t);
}
int top(list_t* stack){
if(stack->succ == NULL){
fprintf(stderr, "Empty\n");
}
return *stack->succ->value;
}
int main(void){
int a[3] = {1,2,3};
int i;
list_t* head1;
head1 = new_list();
for(i = 0; i < 3; i++){
insert_first(head1, &a[i]);
}
printf("Top1: %d\n", top(head1));
}
free_list(head1);
}
答案 0 :(得分:2)
此函数中有一个无用的temp
变量。这是可疑的。但是,这个功能本身并不泄漏。
void insert_first(list_t* list, int* a){
list_t* t;
t = new_list();
在此new_list
之后,t->succ
为空
t->value = a;
t->succ
仍为空。
list_t* temp;
temp = t->succ;
由于t->succ
为空,因此temp
。
t->succ = list->succ;
list->succ = t;
free(temp);
所以free(temp)
只是free(NULL)
;它什么都不做。
}