*** glibc rilevato *** ./a.out: doppio libero o corruzione (superiore): *** 0x08901d70 durante il tentativo di liberare un BST

voti
0

Mi rendo conto ci sono alcuni glibc rilevati i messaggi, ma sarei molto grato se potesse suggerire una soluzione per questo:

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

Questo sembra accadere quando si tenta di liberare un albero binario di ricerca:

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

La struttura è typedef per BNODEPTR

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

Sto chiamando la funzione da main () utilizzando freetree (root).

L'albero sembra essere implementato correttamente come un attraversamento in ordine simmetrico produce un output ordinato.

L'intero codice e ':

http://pastebin.com/Eieu3xDa e

http://pastebin.com/jtGN6XKj

È pubblicato 24/10/2011 alle 14:07
fonte dall'utente
In altre lingue...                            


1 risposte

voti
3

Potrei setacciare il codice sorgente, ma come si suol dire, "Feed un uomo un pesce ..."

  1. Compilare il codice con i simboli di debug (passare -gal compilatore). Se si esegue questa operazione, è possibile ottenere un nome di funzione, invece di ./a.out[0x8048998]nel backtrace.

  2. Eseguire il codice con Valgrind di memcheck strumento (lo strumento predefinito). Questo potrebbe dare una migliore idea di dove l'errore è. Si può semplicemente installare Valgrind e correre valgrind ./a.outper i principianti.

In particolare, credo che tutto l'albero binario è una falsa pista. C'è un altro problema nel vostro programma da qualche altra parte. Dal backtrace, posso vedere che (1) il messaggio di errore non viene attivato in freetreee (2) si utilizza le discussioni, che sono facilmente impropriamente.

Risposto il 24/10/2011 a 14:10
fonte dall'utente

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