2016-05-31 4 views
-2

Ich implementiere eine verkettete Liste in C. Nach dem Lesen der Kommentare habe ich aktualisiert und mehr Code zur Verfügung gestellt, die free() aufruft. Wenn ich den Code unten ausführen bekomme ich den folgenden Fehler "doppelt frei oder Korruption (fasttop):" Ich glaube fest daran, dass dies Free_list kommt, was wahrscheinlich falsch ist. Wenn ichDoppelte freie Korruption, was ist falsch in meiner Funktion free_list?

laufen

valgrind --leak-check = full --show-Leck-Arten = alle

Ich werde die folgende Fehlermeldung erhalten "total Heap-Nutzung: 4 Allocs, 7 frees, 64 Bytes zugewiesen"

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

Es ist unmöglich zu sagen, wo das Problem liegt, da Sie nur einen Teil Ihres Programms gepostet haben. Bitte veröffentlichen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). –

+1

Hat Valgrind Ihnen gesagt, dass etwas definitiv nicht erreichbar ist? Oder einfach nur erreichbar? Hast du Valgrind mit '--leak-check = full' ausgeführt? – Kaz

+1

Mein Verständnis ist, dass 'Valgrind' Ihnen sagen wird, wo der Speicher zugewiesen wurde und nicht wo der Zeiger auf diesen Speicher verloren ging. Dieses Bit müssen Sie herausfinden, mit dem Debugger –

Antwort

2

Sie haben ein nutzloses temp Variable in dieser Funktion. Das ist verdächtig. Diese Funktion ist jedoch nicht selbstleckig.

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

Nach dieser new_list ist t->succ null

t->value = a; 

t->succ noch null ist.

list_t* temp; 
    temp = t->succ; 

Da t->succ ist null, so temp ist.

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

So free(temp) ist nur free(NULL); es tut nichts.

} 
+0

Da es nichts tut, warum wird es als ein Speicherleck gemeldet? – Barmar

+2

Obwohl das richtig ist, sehe ich nicht, wie es die Frage überhaupt anspricht ... – Dmitri

+0

Dann sollte es t = new_list(); das macht eine Leckage und sollte daher frei sein: ed? – Olba12