双重免费腐败,我的函数free_list有什么问题?

时间:2016-05-31 19:48:19

标签: c valgrind

我在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);
}

1 个答案:

答案 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);它什么都不做。

}