C ++ - GDB Error Question

stemmen
1

Ik ben bezig met een binaire zoekboom in C ++. Ik krijg de volgende fouten gemeld na het uitvoeren van gdb (ik ben het ontvangen van een segfault) op het programma:

#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

De # 0 fout verwijst naar mijn getLeft () functie, luidt als volgt:

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

De # 1 fout betreft mijn operator ++ gedefinieerd in mijn iteratoren, luidt als volgt:

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

De # 2-fout verwijst naar mijn belangrijkste programma, waarin ik ook het bestand dat mijn definities voor tree_node bevat, binaryTree, bst_iter en bst_citer (die niet bestaat op dit punt, dus geen probleem).

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

Ik ben niet helemaal zeker wat de oorzaak van de fout. Ik geloof dat ++ () probeert toegang te krijgen tot een gebied dat niet is gedefinieerd, maar ik ben niet zeker waarom het is om dat te doen of hoe het te stoppen ... Ik heb geprobeerd om terug te houden op de code, zoals de code is bijna 800 regels lang, maar als er meer informatie nodig is, laat het me weten ...

De vraag is gesteld op 05/04/2011 om 02:32
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

Hoe bent u het initialiseren van uw lus iterator i? Als het ongeldig te beginnen, dan zou dat dingen uit te leggen.

antwoordde op 05/04/2011 om 02:36
bron van user

stemmen
0

Dit kan gebeuren als pos _-> GetRight () een null pointer.

Omdat u belt getLeft op het resultaat zonder te controleren het voor null, eindig je met een dit pointer die is nul.

antwoordde op 05/04/2011 om 02:46
bron van user

stemmen
0

Zoals u kunt zien in de gdb rug spoor, je uiteindelijk te bellen getLeft()op een NULL pointer. dat wil zeggen zijn deze wijzer is NULL.

In de lus in de operator++, belt u getLeft()op pzonder eerst te controleren of het is NULL. dwz als getRight()null retourneert, zult u crashen.

Wilt u waarschijnlijk iets als dit te doen:

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

Dit is geen volledige oplossing wel. Het hangt een beetje af van wat je end()state of the iterator hoort te zijn.

Echter, het lijkt erop dat er efficiënter en meer intuïtieve manier van uitvoering operator++. STL bijvoorbeeld kunt u items in een boom en slechts ongeldig maken iterators wijst naar dat knooppunt te verwijderen. In uw geval zouden alle iterators moeten worden nietig verklaard.

antwoordde op 05/04/2011 om 02:46
bron van user

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