C ++ - GDB Eroare Întrebare

voturi
1

Sunt de lucru pe un arbore binar de căutare în C ++. Primesc următoarele erori raportate după rularea GDB (am primit o segfault) pe programul meu:

#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

Eroarea # 0 se referă la funcția mea getLeft (), care este după cum urmează:

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

Eroarea # 1 se referă la operatorul meu ++ definit în iteratori mea, care este după cum urmează:

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

Eroarea # 2 se referă la programul meu principal, în care eu sunt inclusiv fișierul care conține definițiile mele pentru tree_node, binaryTree, bst_iter și bst_citer (care nu există în acest moment, așa că nu o 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);
         }

Nu sunt sigur ce cauzează eroarea. Eu cred că ++ () încearcă să acceseze o zonă care nu a fost definit, dar nu sunt foarte sigur de ce face asta sau cum să-l oprească ... am încercat să frâneze pe codul, deoarece codul este lung de aproape 800 de linii, dar, în cazul în care este nevoie de mai multe informații, lasă-mă să știu ...

Întrebat 05/04/2011 la 02:32
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

Cum vă initializarea pentru bucla iterator i? Dacă este invalid, pentru a începe cu, atunci ar explica lucrurile.

Publicat 05/04/2011 la 02:36
sursa de către utilizator

voturi
0

Acest lucru ar putea întâmpla dacă pos _-> Getright () returnează un pointer nul.

Din moment ce fac apel getLeft pe rezultatul fără a verifica-l pentru nul, va termina cu un acest indicator, care este nul.

Publicat 05/04/2011 la 02:46
sursa de către utilizator

voturi
0

După cum puteți vedea în GDB urme din spate, sa terminat de asteptare getLeft()pe un pointer NULL. adică ei acest indicator este NULL.

În bucla interiorul operator++, te sun getLeft()pe pfără ca mai întâi verificarea dacă este NULL. de exemplu , în cazul în care se getRight()întoarce NULL, vei prăbuși.

Probabil că vrei să faci ceva de genul:

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

Aceasta nu este o soluție completă , totuși. Depinde de un pic de ceea ce dvs. end()starea de iteratorului ar trebui să fie.

Cu toate acestea, se pare ca sunt mai eficiente și mai intuitive modalități de punere în aplicare operator++. STL , de exemplu , vă permite să ștergeți intrările într - un copac și numai iteratori invalidează , ce indică spre acel nod. In cazul tau, toate iteratorii ar trebui să fie invalidat.

Publicat 05/04/2011 la 02:46
sursa de către utilizator

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