*** glibc zjištěno *** ./a.out: dvojitý zdarma nebo poškození (nahoře): 0x08901d70 *** při pokusu uvolnit BST

hlasů
0

Uvědomuji si, existuje několik „glibc zjištěné“ příspěvky, ale byl bych velmi vděčný, kdybyste mohl navrhnout řešení pro toto:

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

Zdá se to stalo, když jsem se pokusil uvolnit strom binárního vyhledávání:

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

Struktura je typedef'd na BNODEPTR

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

Volám funkce z hlavní () s použitím freetree (root).

Strom se zdá být provedena správně, jako nezbytného průchod vytvoří seřazený výstup.

Celý kód je na adrese:

http://pastebin.com/Eieu3xDa a

http://pastebin.com/jtGN6XKj

Položena 24/10/2011 v 14:07
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
3

Mohl bych probrat zdrojového kódu, ale jak se říká, „Nakrmte člověku rybu ...“

  1. Sestavit svůj kód ladění symboly (přenést -gkompilátoru). Pokud tak učiníte, můžete získat název funkce namísto ./a.out[0x8048998]v backtrace.

  2. Spustit svůj kód Valgrind je memcheck nástroje (výchozí nástroj). To vám může poskytnout mnohem lepší ponětí o tom, kde je chyba. Stačí nainstalovat a spustit Valgrind valgrind ./a.outpro začátek.

Především si myslím, že celý binární strom je falešná stopa. Je tu ještě další problém v programu někde jinde. Z backtrace, vidím, že (1) se zobrazí chybová zpráva není spuštěna v freetreea (2), kterou používáte závity, které jsou snadno zneužita.

Odpovězeno 24/10/2011 v 14:10
zdroj uživatelem

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