C ++ - GDB Fehler Frage

stimmen
1

Ich arbeite an einem binären Suchbaum in C ++. Ich erhalte die folgenden Fehler gemeldet, nachdem gdb läuft (ich bin ein segfault Empfang) auf meinem Programm:

#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

Die # 0 Fehler beziehen sich auf mein getLeft () Funktion, die wie folgt lautet:

    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>*
    }

Die # 1 Fehler bezieht sich auf meinen Operator ++ definierte in meinem Iteratoren, die wie folgt lautet:

        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;
        }

Die # 2 Fehler bezieht sich auf mein Hauptprogramm, in dem ich die Datei bin auch, dass meine Definitionen für tree_node enthält, BinaryTree, bst_iter und bst_citer (die an dieser Stelle nicht existiert, so kein Problem).

                            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);
         }

Ich bin mir nicht ganz sicher, was den Fehler verursacht. Ich glaube, dass ++ () versucht, einen Bereich zuzugreifen, die nicht definiert wird, aber ich bin nicht wirklich sicher, warum es das, oder wie macht es zu stoppen ... Ich habe versucht, auf dem Code zurück zu halten, wie der Code fast 800 Zeilen lang ist, aber wenn mehr Informationen erforderlich sind, lassen Sie mich wissen ...

Veröffentlicht am 05/04/2011 um 02:32
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

Wie initialisieren Sie Ihre for-Schleife Iterator i? Wenn es ungültig ist zu beginnen, erklären, dass würde dann Dinge.

Beantwortet am 05/04/2011 um 02:36
quelle vom benutzer

stimmen
0

Dies könnte passieren, wenn pos _-> getRight () einen Null-Zeiger zurückgibt.

Da Sie getLeft auf das Ergebnis fordern, ohne sie für null Kontrolle, beenden Sie mit einem dieser Zeiger nach oben, die null ist.

Beantwortet am 05/04/2011 um 02:46
quelle vom benutzer

stimmen
0

Wie Sie in der GDB zurück Spur sehen können, beenden Sie ruft getLeft()auf einen NULL - Zeiger. dh dem dieser Zeiger ist NULL.

In der Schleife innerhalb der operator++, rufen Sie getLeft()auf , pohne vorher zu überprüfen , ob es NULL ist. dh wenn getRight()gibt NULL zurück, werden Sie zum Absturz bringen.

Sie wollen wahrscheinlich so etwas wie dies zu tun:

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;
    }

Dies ist keine vollständige fix though. Es hängt ein wenig auf , was Ihr end()Zustand des Iterators sein soll.

Allerdings scheint es , wie es effiziente und intuitive Art und Weise der Umsetzung ist operator++. STL zum Beispiel können Sie Einträge in einem Baum löschen und nur entkräften Iteratoren zu diesem Knoten zeigt. In Ihrem Fall müßten alle Iteratoren für ungültig erklärt werden.

Beantwortet am 05/04/2011 um 02:46
quelle vom benutzer

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