C - *** glibc检测*** ./a.out: double free或corruption (top): 0x



我确实意识到有一些"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);
        }
}  

结构被定义为BNODEPTR

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

我正在使用freetree(root)从main()调用函数。

这个树的实现似乎是正确的,因为一个无序的遍历产生一个排序的输出。

整个代码位于:

http://pastebin.com/Eieu3xDa

http://pastebin.com/jtGN6XKj

我可以筛选您的源代码,但正如他们所说,"喂人一条鱼…"

  1. 用调试符号编译代码(将-g传递给编译器)。如果你这样做,你可以在回溯中得到一个函数名而不是./a.out[0x8048998]

  2. 使用Valgrind的memcheck工具(默认工具)运行代码。这可能会让您更好地了解错误在哪里。

  3. 你可以安装Valgrind并运行valgrind ./a.out作为启动器。
特别是,我认为整个二叉树是一个转移注意力的东西。你的程序在其他地方还有一个问题。从回溯中,我可以看到(1)在freetree中没有触发错误消息,(2)您正在使用线程,这很容易被滥用。

最新更新