C ++ - GDB errore Question

voti
1

Sto lavorando su un binario Cerca Albero in C ++. Sto ottenendo i seguenti errori riportati dopo l'esecuzione gdb (Ricevo un segfault) sul mio 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

L'errore # 0 si riferisce alla mia funzione getLeft (), che è la seguente:

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

L'errore # 1 si riferisce al mio operatore ++ definito nei miei iteratori, che è la seguente:

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

L'errore # 2 si riferisce al mio programma principale, in cui sono incluso il file che contiene le mie definizioni per tree_node, BinaryTree, bst_iter, e bst_citer (che non esiste, a questo punto, quindi non un problema).

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

Io non sono del tutto sicuro che cosa sta causando l'errore. Credo che ++ () sta cercando di accedere a una zona che non è stato definito, ma io non sono davvero sicuro perché sta facendo che o il modo di fermarlo ... ho provato a tenere indietro sul codice, come il codice è lunga quasi 800 linee, ma se è necessario ulteriori informazioni, fatemelo sapere ...

È pubblicato 05/04/2011 alle 02:32
fonte dall'utente
In altre lingue...                            


3 risposte

voti
1

Come ti inizializzazione del ciclo for iteratore i? Se è valida per cominciare, che poi sarebbe spiegare le cose.

Risposto il 05/04/2011 a 02:36
fonte dall'utente

voti
0

Questo potrebbe accadere se pos _-> GetRight () restituisce un puntatore nullo.

Dal momento che si sta chiamando getLeft sul risultato senza controllare per nulla, si finisce con un puntatore che questo è nullo.

Risposto il 05/04/2011 a 02:46
fonte dall'utente

voti
0

Come si può vedere nella traccia posteriore gdb, si finisce per chiamare getLeft()su un puntatore NULL. cioè il suo questo puntatore è NULL.

Nel suo ciclo all'interno del operator++, si chiama getLeft()il psenza prima verificare se è NULL. cioè se getRight()restituisce null, ti crash.

Probabilmente si vuole fare qualcosa di simile a questo:

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

Questa non è una soluzione completa però. Dipende un po 'che cosa il vostro end()stato della iteratore si suppone che sia.

Tuttavia, sembra che ci sono più efficienti e modo più intuitivo di attuazione operator++. STL per esempio consente di eliminare le voci in un albero e solo iteratori invalidanti che puntano a quel nodo. Nel tuo caso, tutti gli iteratori dovrebbero essere invalidato.

Risposto il 05/04/2011 a 02:46
fonte dall'utente

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