*** glibc detectat *** ./a.out: dublu liberă sau corupție (sus): 0x08901d70 *** în timp ce încerca să elibereze o BST

voturi
0

Eu dau seama că sunt niște „glibc detectate“ posturi, dar aș fi foarte recunoscător dacă ați putea sugera o soluție pentru acest lucru:

*** 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: ========

Acest lucru pare să se întâmple când încerc să elibereze un arbore binar de căutare:

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

Structura este typedef'd la BNODEPTR

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

Eu sun funcția principală de la freetree () folosind (root).

Copacul pare să fie pus în aplicare în mod corect ca un parcurgeri inordine produce o ieșire de sortat.

Întregul cod este la:

http://pastebin.com/Eieu3xDa și

http://pastebin.com/jtGN6XKj

Întrebat 24/10/2011 la 14:07
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
3

Aș putea trece prin codul sursă, dar cum se spune, „Hraneste un om un pește ...“

  1. Compilați codul cu simboluri de depanare (treci -gla compilator). Dacă faci acest lucru, puteți obține un nume de funcție în locul ./a.out[0x8048998]în backtrace.

  2. Rulați codul cu Valgrind lui memcheck instrument (instrumentul implicit). Acest lucru s-ar putea da un indiciu mult mai bine în cazul în care eroarea este. Puteți instala și rula doar Valgrind valgrind ./a.outpentru inceput.

În special, cred că întregul arbore binar este un hering roșu. Există o altă problemă în programul dvs. în altă parte. Din backtrace, eu pot vedea că (1) mesajul de eroare nu este declanșată în freetreeși (2) folositi fire, care sunt ușor folosite în mod abuziv.

Publicat 24/10/2011 la 14:10
sursa de către utilizator

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