私はCでリンクリストを実装しています。コメントを読んだ後、私はfree()を呼び出すコードを更新して提供しました。以下のコードを実行すると、次のエラーが表示されます。「ダブルフリーまたは破損(fasttop)」:「これはおそらく間違っているfree_listになると強く信じています。私はダブルフリーの破損、私の関数free_listの何が間違っていますか?
valgrindの--leak-チェック=フル--show-漏れ種類=すべて
を実行する場合、私は次のようなエラー ":4つのallocs、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);
}
あなたのプログラムの一部だけを投稿しているため、どこに問題があるのかは分かりません。 [最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 –
Valgrindはあなたに何かが確実に到達できないと伝えますか?それともまだ届いていますか?あなたは '--leak-check = full'でvalgrindを実行しましたか? – Kaz
私の理解では、 'valgrind'は、メモリがどこに割り当てられたのか、そしてそのメモリへのポインタがどこに失われたのかを教えてくれます。あなたがデバッガで把握する必要があるビット –