*** *** glibc detektiert ./a.out: double freie oder Korruption (oben): 0x08901d70 *** Beim Versuch, eine BST zu befreien

stimmen
0

Ich weiß, es gibt einige „glibc erkannt“ Beiträge, aber ich wäre sehr dankbar, wenn Sie eine Lösung für dieses vorschlagen könnte:

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

Dies scheint zu passieren, wenn ich einen binären Suchbaum zu befreien versuchen:

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

Die Struktur wird auf typedef'd BNODEPTR

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

Ich rufe die Funktion von main () mit Freetree (root).

Der Baum scheint korrekt umgesetzt werden als ein Inorder Traversal eine sortierte Ausgabe erzeugt.

Der gesamte Code ist unter:

http://pastebin.com/Eieu3xDa und

http://pastebin.com/jtGN6XKj

Veröffentlicht am 24/10/2011 um 14:07
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
3

Ich konnte den Quellcode sichten, sondern wie sie sagen, „einem Mann einen Fisch-Feed ...“

  1. Kompilieren Sie Ihren Code mit Debugging - Symbole (mit -gdem Compiler). Wenn Sie dies tun, können Sie einen Funktionsnamen erhalten , anstatt ./a.out[0x8048998]in der Backtrace.

  2. Führen Sie Ihren Code mit Valgrind des memcheck Werkzeug (das Standardwerkzeug). Dies könnte Ihnen eine viel bessere Ahnung , wo der Fehler ist. Sie können nur Valgrind installieren und ausführen valgrind ./a.outfür den Anfang.

Insbesondere denke ich die ganze binäre Baum ist ein roter Hering. Es gibt ein weiteres Problem in Ihrem Programm woanders. Von der Backtrace kann ich , dass (1) die Fehlermeldung wird nicht ausgelöst , in sehen freetreeund (2) Sie Threads verwenden, die leicht missbraucht werden.

Beantwortet am 24/10/2011 um 14:10
quelle vom benutzer

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