2016-05-31 10 views
-2

私は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); 
} 
+1

あなたのプログラムの一部だけを投稿しているため、どこに問題があるのか​​は分かりません。 [最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してください。 –

+1

Valgrindはあなたに何かが確実に到達できないと伝えますか?それともまだ届いていますか?あなたは '--leak-check = full'でvalgrindを実行しましたか? – Kaz

+1

私の理解では、 'valgrind'は、メモリがどこに割り当てられたのか、そしてそのメモリへのポインタがどこに失われたのかを教えてくれます。あなたがデバッガで把握する必要があるビット –

答えて

2

この機能では、無効なtemp変数があります。それは疑わしい。ただし、この機能は単独ではリークしません。このnew_list

void insert_first(list_t* list, int* a){ 
    list_t* t; 
    t = new_list(); 

t->succ

t->value = a; 

t->succはまだnullのnullです。 t->succ以来

list_t* temp; 
    temp = t->succ; 

のでtempは、nullです。

t->succ = list->succ; 
    list->succ = t; 
    free(temp); 

のでfree(temp)はちょうどfree(NULL)です。それは何もしません。

} 
+0

何もしないので、なぜメモリリークとして報告されますか? – Barmar

+2

これは正しいですが、どのように問題に対処しているのかわかりません... – Dmitri

+0

それはt = new_list()です。それは漏れを起こすので自由でなければなりません。 – Olba12

関連する問題