*** glibc wykryte *** ./a.out: podwójne wolne lub korupcji (góra): 0x08901d70 *** podczas próby uwolnienia BST

głosy
0

Zdaję sobie sprawę, istnieją pewne „glibc detected” posty, ale byłbym bardzo wdzięczny gdybyś mógł zaproponować rozwiązanie tego problemu:

*** glibc detected *** ./a.out: double free or corruption (top): 0x08901d70 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x17c501]
/lib/libc.so.6(+0x6dd70)[0x17dd70]
/lib/libc.so.6(cfree+0x6d)[0x180e5d]
/lib/libc.so.6(fclose+0x14a)[0x16c81a]
./a.out[0x8048998]
/lib/libpthread.so.0(+0x5cc9)[0xc1fcc9]
/lib/libc.so.6(clone+0x5e)[0x1e069e]
======= Memory map: ========

Wydaje się to zdarzyć, gdy próbuję uwolnić przeszukiwanie binarne drzewo:

void freetree(BNODEPTR *root)
{
        if(root!=NULL)
        {
                freetree(root->left);
                freetree(root->right);
                free(root);
        }
}  

Struktura jest typedef'd do BNODEPTR

struct bnode{
        int info;
        int count;
        struct bnode* left;
        struct bnode* right;
};

Wołam z funkcji main () używając freetree (root).

Drzewo wydaje się być prawidłowo realizowane jako przechodzenie inorder produkuje wyjście posortowana.

Cały kod jest pod adresem:

http://pastebin.com/Eieu3xDa i

http://pastebin.com/jtGN6XKj

Utwórz 24/10/2011 o 14:07
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
3

Mógłbym przesiać przez kodzie źródłowym, ale jak to mówią: „Paś człowiekowi rybę ...”

  1. Skompilować kod z symboli debugowania (przechodzą -gdo kompilatora). Jeśli to zrobisz, możesz uzyskać nazwę funkcji zamiast ./a.out[0x8048998]w backtrace.

  2. Uruchomić kod z Valgrind za memcheck narzędzia (narzędzie domyślne). To może dać znacznie lepsze pojęcia o tym, gdzie jest błąd. Można po prostu zainstalować Valgrind i uruchomić valgrind ./a.outna początek.

W szczególności, myślę, że całe drzewo binarne jest czerwony śledź. Jest jeszcze inny problem w swoim programie gdzieś indziej. Z backtrace, widzę, że (1) komunikat o błędzie nie jest wyzwalany w freetreei (2) używasz wątków, które są łatwo nadużywane.

Odpowiedział 24/10/2011 o 14:10
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more