*** Glibc обнаружено *** ./a.out: двойной бесплатно или повреждение (сверху): 0x08901d70 *** при попытке освободить BST

голоса
0

Я понимаю, что есть некоторые «Glibc обнаружены» сообщения, но я был бы очень признателен, если вы могли бы предложить решение для этого:

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

Это, кажется, происходит при попытке освободить дерево двоичного поиска:

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

Структура typedef'd к BNODEPTR

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

Я вызываю функцию из основного (), используя freetree (корень).

Дерево, кажется, реализовано правильно как симметричный обход производит отсортированный вывод.

Весь код по адресу:

http://pastebin.com/Eieu3xDa и

http://pastebin.com/jtGN6XKj

Задан 24/10/2011 в 14:07
источник пользователем
На других языках...                            


1 ответов

голоса
3

Я мог бы просеять через исходный код, но, как говорится, «Кормите человеку рыбу ...»

  1. Компиляция кода с символами отладки (передать -gкомпилятору). Если вы сделаете это, вы можете получить имя функции , а не ./a.out[0x8048998]в трассировке.

  2. Выполнить код с valgrind для MemCheck инструмента (инструмент по умолчанию). Это может дать вам гораздо лучше подсказки о том, где ошибка. Вы можете просто установить и запустить Valgrind valgrind ./a.outдля начинающих.

В частности, я думаю , что все бинарное дерево является отвлекающим маневром. Существует еще одна проблема , в вашей программе где - то еще. Из трассировки, я могу видеть , что (1) сообщение об ошибке не срабатывает в freetreeи (2) вы используете нити, которые легко злоупотребляют.

Ответил 24/10/2011 в 14:10
источник пользователем

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