C ++ - Błąd Pytanie GDB

głosy
1

Pracuję na binarne drzewo poszukiwań w C ++. Dostaję następujące błędy zgłoszone po uruchomieniu gdb (ja dostaję segfault) na moim programie:

#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

Przyciski # 0 błędu odnosi się do mojego getLeft function (), która jest w następujący sposób:

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

Błąd nr 1 odnosi się do mojego operatora ++ określonym w moich iteratorów, który brzmi następująco:

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

Błąd nr 2 odnosi się do mojego głównego programu, w której jestem w tym pliku, który zawiera moje definicje tree_node, binaryTree, bst_iter i bst_citer (który nie istnieje w tym momencie, więc nie 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);
         }

Nie jestem do końca pewien, co jest przyczyną błędu. Wierzę, że ++ () próbuje uzyskać dostęp do obszaru, który nie został zdefiniowany, ale nie jestem pewien, dlaczego to robi, że albo jak go zatrzymać ... Starałem się powstrzymać od kodu, jak kod ma prawie 800 linii, ale jeśli jest wymagana więcej informacji, daj mi znać ...

Utwórz 05/04/2011 o 02:32
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
1

Jak jesteś inicjalizacji swojej pętli iteracyjnej I? Jeśli to jest nieważne na początku, to byłoby wyjaśnić rzeczy.

Odpowiedział 05/04/2011 o 02:36
źródło użytkownik

głosy
0

To może się zdarzyć, jeśli poz _-> GetRight () zwraca wskaźnik zerowy.

Od dzwonisz getLeft na wynik bez sprawdzenia go na null, skończyć z tym wskaźnikiem, który jest NULL.

Odpowiedział 05/04/2011 o 02:46
źródło użytkownik

głosy
0

Jak widać w gdb tyłu śladu, skończyć się dzwoniąc getLeft()na wskaźnik NULL. czyli jej ten wskaźnik jest NULL.

W swojej pętli w kasecie operator++, należy zadzwonić getLeft()na pbez uprzedniego sprawdzenia, czy jest to NULL. czyli jeśli getRight()zwraca NULL, można upaść.

Prawdopodobnie chcesz zrobić coś takiego:

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

To nie jest kompletna fix chociaż. To zależy trochę na co twój end()stan iterator ma być.

Jednak wydaje się, że są bardziej wydajne i bardziej intuicyjne sposoby realizacji operator++. STL na przykład pozwala usuwać wpisy w drzewie i tylko utraty ważności iteratory wskazujące na tym węźle. W twoim przypadku, wszystkie iteratory musiałyby zostać unieważnione.

Odpowiedział 05/04/2011 o 02:46
źródło użytkownik

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