C ++ - GDB Ερώτηση σφάλματος

ψήφοι
1

Δουλεύω σε ένα δυαδικό Αναζήτηση δέντρο σε C ++. Παίρνω τα ακόλουθα σφάλματα που αναφέρθηκαν μετά την εκτέλεση gdb (είμαι παραλαβή segfault) για το πρόγραμμα μου:

#0  0x08049058 in searchTree::tree_node<int>::getLeft (this=0x0) at bst.hxx:75
#1  0x08048ed8 in searchTree::bst_iter<int>::operator++ (this=0xbffff4b4) at bst.hxx:586
#2  0x08048a72 in main () at projectmain.cxx:29

Το σφάλμα # 0 αναφέρεται σε getLeft () λειτουργία μου, η οποία έχει ως εξής:

    template <typename T>
    inline tree_node<T>* tree_node<T>::getLeft() const
    {
        return tree_node<T>::left_; //note that left_ is of type tree_node<T>*
    }

Το σφάλμα # 1 αναφέρεται σε χειριστή μου ++ ορίζεται στο iterators μου, η οποία έχει ως εξής:

        bst_iter<T>& operator++()
        { //note that s is a stack of tree_node<T>*
            tree_node<T> *p = pos_->getRight();
            s.push(p);
            for(p=p->getLeft(); p!=NULL; p=p->getLeft())
            {
                s.push(p);
            }
            pos_ = s.top();
            s.pop();
            return *this;
        }

Το σφάλμα # 2 αναφέρεται στο κύριο πρόγραμμά μου, με τον οποίο έχω συμπεριλαμβανομένου του αρχείου που περιέχει τους ορισμούς μου για tree_node, binaryTree, bst_iter και bst_citer (η οποία δεν υπάρχει σε αυτό το σημείο, έτσι δεν είναι ένα ζήτημα).

                            bst_iter<int> i = treeTime.begin(); //treeTime is our tree
            bst_iter<int> iEnd = treeTime.end();
                            for(; i != iEnd ;++i) //crash
            {
                cout<<*i<< ;
            }

        template <typename T>
        inline bst_iter<T> binaryTree<T>::begin()
         {

             return bst_iter<T>(root_);
         }

        template <typename T>
        inline bst_iter<T> binaryTree<T>::end()
         {
            return bst_iter<T>(0);
         }

Δεν είμαι απόλυτα σίγουρος τι προκαλεί το σφάλμα. Πιστεύω ότι ++ () προσπαθεί να αποκτήσει πρόσβαση σε ένα χώρο που δεν έχει καθοριστεί, αλλά δεν είμαι σίγουρος γι 'αυτό που κάνει αυτό ή πώς να το σταματήσει ... Προσπάθησα να κρατήσει πίσω του κώδικα, όπως ο κώδικας έχει μήκος περίπου 800 γραμμές, αλλά αν χρειάζεται περισσότερες πληροφορίες, επιτρέψτε μου να ξέρω ...

Δημοσιεύθηκε 05/04/2011 στις 02:32
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
1

Πώς θα την προετοιμασία σας για το loop iterator i; Αν είναι άκυρη για να αρχίσει με, τότε αυτό θα μπορούσε να εξηγήσει τα πράγματα.

Απαντήθηκε 05/04/2011 στις 02:36
πηγή χρήστη

ψήφοι
0

Αυτό θα μπορούσε να συμβεί αν pos _-> GetRight () επιστρέφει ένα δείκτη null.

Από τη στιγμή που καλείτε getLeft στο αποτέλεσμα, χωρίς τον έλεγχο αυτό για null, μπορείτε να καταλήξετε με ένα αυτό το δείκτη που είναι null.

Απαντήθηκε 05/04/2011 στις 02:46
πηγή χρήστη

ψήφοι
0

Όπως μπορείτε να δείτε στο πίσω μέρος ίχνος gdb, μπορείτε να καταλήξετε καλώντας getLeft()σε ένα δείκτη NULL. δηλαδή του αυτή ο δείκτης είναι NULL.

Στο βρόχο σας στο εσωτερικό του operator++, σας καλούν getLeft()σε pχωρίς έλεγχο αν είναι NULL. δηλαδή εάν getRight()επιστρέφει null, θα συντριβή.

Πιθανόν να θέλετε να κάνετε κάτι σαν αυτό:

bst_iter<T>& operator++()
    { //note that s is a stack of tree_node<T>*
        tree_node<T> *p = pos_->getRight();
        if (p == NULL) p = pos_;
        else s.push(p);
        for(p=p->getLeft(); p!=NULL; p=p->getLeft())
        {
            s.push(p);
        }
        // TODO: what if s is empty?
        pos_ = s.top();
        s.pop();
        return *this;
    }

Αυτή δεν είναι μια πλήρης λύση όμως. Εξαρτάται από λίγο για το τι σας end()κατάσταση του iterator υποτίθεται ότι είναι.

Ωστόσο, φαίνεται ότι υπάρχουν πιο αποτελεσματική και πιο διαισθητική τρόπους εφαρμογής operator++. STL, για παράδειγμα, σας επιτρέπει να διαγράψετε καταχωρήσεις σε ένα δέντρο και μόνο ακύρωση επαναλήπτες που δείχνουν προς αυτόν τον κόμβο. Στην περίπτωσή σας, όλες οι επαναλήπτες θα πρέπει να ακυρωθεί.

Απαντήθηκε 05/04/2011 στις 02:46
πηγή χρήστη

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