*** 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 (root).

Το δέντρο φαίνεται να εφαρμοστεί σωστά ως διάσχιση inorder παράγει μια ταξινομημένη έξοδο.

Το σύνολο του κώδικα είναι:

http://pastebin.com/Eieu3xDa και

http://pastebin.com/jtGN6XKj

Δημοσιεύθηκε 24/10/2011 στις 14:07
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
3

Θα μπορούσα να κοσκινίσει μέσω του πηγαίου κώδικα σας, αλλά όπως λένε, «Feed σε κάποιον ένα ψάρι ...»

  1. Συντάξτε τον κώδικά σας με τον εντοπισμό σφαλμάτων συμβόλων (περνούν -gστη compiler). Αν το κάνετε αυτό, μπορείτε να πάρετε ένα όνομα λειτουργία αντί ./a.out[0x8048998]του backtrace.

  2. Εκτελέστε τον κωδικό σας Valgrind του memcheck εργαλείο (το προεπιλεγμένο εργαλείο). Αυτό μπορεί να σας δώσει μια πολύ καλύτερη ιδέα για το πού βρίσκεται το λάθος. Μπορείτε απλά να εγκαταστήσετε Valgrind και να τρέξει valgrind ./a.outγια ορεκτικά.

Συγκεκριμένα, νομίζω ότι η όλη δυαδικό δέντρο είναι μια κόκκινη ρέγγα. Υπάρχει και ένα άλλο πρόβλημα στο πρόγραμμά σας κάπου αλλού. Από το backtrace, μπορώ να δω ότι (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