*** Обнаружен glibc *** ./a.out: двойное освобождение или повреждение (вверху): 0x08901d70 *** при попытке освободить BST - PullRequest
0 голосов
/ 24 октября 2011

Я понимаю, что есть сообщения "обнаружен 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: ========

Это происходит, когда я пытаюсь освободить бинарный поискtree:

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;
};

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

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

Весь код находится по адресу:

http://pastebin.com/Eieu3xDa и

http://pastebin.com/jtGN6XKj

1 Ответ

3 голосов
/ 24 октября 2011

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

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

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

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

...