C ++ - GDB Feil Spørsmål

stemmer
1

Jeg jobber med et binært søketre i C ++. Jeg får følgende feil rapporteres etter å ha kjørt gdb (Jeg mottar en segfault) på mitt 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

Den # 0 error refererer til min getLeft () -funksjonen, som er som følger:

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

# 1 feil refererer til min operatør ++ definert i mine iteratorer, som er som følger:

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

# 2 feil refererer til min hovedprogrammet, der jeg blant annet filen som inneholder mine definisjoner for tree_node, BinærTre, bst_iter, og bst_citer (som ikke eksisterer på dette punktet, så ikke et 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);
         }

Jeg er ikke helt sikker på hva som er årsaken til feilen. Jeg tror at ++ () prøver å få tilgang til et område som ikke er definert, men jeg er ikke helt sikker på hvorfor den gjør det eller hvordan å stoppe det ... Jeg prøvde å holde tilbake på koden, som koden er nesten 800 linjer lange, men hvis mer informasjon er nødvendig, la meg vite ...

Publisert på 05/04/2011 klokken 01:32
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Hvordan har du initialisering din for loop iterator jeg? Hvis det er ugyldig å begynne med, så det ville forklare ting.

Svarte 05/04/2011 kl. 01:36
kilden bruker

stemmer
0

Dette kan skje hvis pos _-> GetRight () returnerer en nullpeker.

Siden du ringer getLeft på resultatet uten å sjekke det for null, ender du opp med en dette peker som er null.

Svarte 05/04/2011 kl. 01:46
kilden bruker

stemmer
0

Som du kan se i gdb tilbake spor, ender du opp med å kalle getLeft()på en NULL-peker. dvs. dens denne pekeren er NULL.

I sløyfe inne i operator++, ringe deg getLeft()puten først å sjekke om det er NULL. dvs. hvis getRight()returnerer null, vil du krasjer.

Du har sannsynligvis ønsker å gjøre noe sånt som dette:

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

Dette er ikke en komplett løsning skjønt. Det avhenger litt av hva din end()tilstand av iterator er ment å være.

Men det virker som det er mer effektive og mer intuitive måter å gjennomføre operator++. STL for eksempel kan du slette oppføringene i et tre og bare ugyldigiteratorer som peker til den noden. I ditt tilfelle, ville alle iteratorer må oppheves.

Svarte 05/04/2011 kl. 01:46
kilden bruker

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