C ++ - GDB Error kérdés

szavazat
1

Dolgozom bináris kereső fába C ++. Kezdek a következő hibákat jelentették futás után gdb (kapok egy segfault) én program:

#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

A # 0 hiba utal én getLeft () függvény, amely a következő:

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

A # 1 hiba utal én üzemeltető ++ meghatározott én iterátorokat, amely a következő:

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

A # 2 hiba utal a fő programot, amiben én többek között a fájl, amely az én definícióit tree_node, binaryTree, bst_iter és bst_citer (ami nem létezik ezen a ponton, így nem probléma).

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

Nem vagyok teljesen biztos benne, mi okozza a hibát. Úgy vélem, hogy ++ () próbál hozzáférni egy olyan területen, amely nem került meghatározásra, de nem vagyok igazán, miért csinál, hogy vagy hogyan megállítani ... Megpróbáltam visszatartani a kódot, a kód szinte 800 sor hosszú, de ha több információra van szükség, szólj ...

A kérdést 05/04/2011 02:32
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
1

Hogy inicializálása a hurok bejáró i? Ha ez érvénytelen kezdeni, akkor ez lenne megmagyarázni a dolgokat.

Válaszolt 05/04/2011 02:36
a forrás felhasználó

szavazat
0

Ez akkor fordulhat elő, ha pos _-> Getright () visszaad egy null pointer.

Mivel van hívás getLeft az eredmény ellenőrzése nélkül azt null, akkor a végén egy ez a mutató, mely null.

Válaszolt 05/04/2011 02:46
a forrás felhasználó

szavazat
0

Mint látható, a gdb vissza nyom, akkor a végén hív getLeft()egy NULL pointer. azaz annak ez a mutató értéke NULL.

Az Ön hurok belsejében operator++, akkor hívja getLeft()fel panélkül, hogy az első ellenőrző ha ez NULL. azaz, ha getRight()NULL, akkor összeomlik.

Valószínűleg akar tenni valamit, mint ez:

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

Ez nem egy teljes fix mégis. Ez attól egy kicsit, hogy mi a end()állam a bejáró állítólag.

Azonban úgy tűnik, mintha még hatékonyabb és intuitív módon implementálható operator++. STL például lehetővé teszi, hogy törli azokat a bejegyzéseket egy fa, és csak érvénytelenítése iterátorokat mutatva, hogy a csomópontot. Az Ön esetében az összes iterátorokat volna érvényteleníteni kell.

Válaszolt 05/04/2011 02:46
a forrás felhasználó

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