*** *** glibc détecté ./a.out: double libération ou de corruption (en haut): 0x08901d70 *** en tentant de libérer un BST

voix
0

Je sais qu'il ya des « glibc détectés » messages mais je serais très reconnaissant si vous pouviez proposer une solution pour cela:

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

Cela semble se produire lorsque je tente de libérer un arbre de recherche binaire:

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

La structure est typedef à BNODEPTR

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

J'appelle la fonction de principal () à l'aide freetree (root).

L'arbre semble être correctement mis en œuvre comme un parcours infixe produit une sortie triée.

Tout le code est à l'adresse:

http://pastebin.com/Eieu3xDa et

http://pastebin.com/jtGN6XKj

Créé 24/10/2011 à 14:07
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
3

Je pourrais passer en revue votre code source, mais comme on dit, « Nourrir un homme un poisson ... »

  1. Compiler votre code avec des symboles de débogage (passer -gau compilateur). Si vous faites cela, vous pouvez obtenir un nom de fonction au lieu de ./a.out[0x8048998]la rétrospection.

  2. Exécutez votre code avec de Valgrind memcheck outil (l'outil par défaut). Cela pourrait vous donner un indice beaucoup mieux où l'erreur est. Vous pouvez installer simplement Valgrind et exécuter valgrind ./a.outpour commencer.

En particulier, je pense que l'ensemble arbre binaire est un faux problème . Il y a un autre problème dans votre programme ailleurs. De la rétrospection, je peux voir que (1) le message d'erreur ne se déclenche pas dans freetreeet (2) que vous utilisez des fils, qui sont facilement utilisées à mauvais escient.

Créé 24/10/2011 à 14:10
source utilisateur

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