C ++ - BGF error pregunta

votos
1

Estoy trabajando en un árbol binario de búsqueda en C ++. Me estoy poniendo los siguientes errores reportados después de ejecutar gdb (Estoy recibiendo un error de segmentación) en mi programa:

#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

El error # 0 se refiere a mi función getLeft (), que es como sigue:

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

El error # 1 se refiere a mi operador ++ se define en mis iteradores, que es como sigue:

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

El error # 2 se refiere al programa principal, en el que estoy incluyendo el archivo que contiene definiciones para mis tree_node, BinaryTree, bst_iter y bst_citer (que no existe en este momento, así que no es 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);
         }

No estoy del todo seguro de lo que está causando el error. Creo que ++ () está intentando acceder a un área que no ha sido definida, pero no estoy realmente seguro de por qué está haciendo eso o cómo detenerlo ... Traté de contener en el código, como el código de es casi 800 líneas de largo, pero si se requiere más información, hágamelo saber ...

Publicado el 05/04/2011 a las 02:32
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

¿Cómo está inicializando el iterador de bucle i? Si es válido, para empezar, entonces eso explicaría las cosas.

Respondida el 05/04/2011 a las 02:36
fuente por usuario

votos
0

Esto podría ocurrir si pos _-> Getright () devuelve un puntero nulo.

Puesto que usted está llamando getLeft en el resultado sin comprueba si existe alguna nula, se termina con un puntero que esta es nula.

Respondida el 05/04/2011 a las 02:46
fuente por usuario

votos
0

Como se puede ver en la traza de vuelta GDB, se termina llamando getLeft()a un puntero NULL. es decir, su este puntero es NULL.

En el bucle dentro de la operator++, se llama getLeft()en psin comprobar primero si es NULL. es decir, si getRight()devuelve NULL, podrás accidente.

Es posible que desee hacer algo como esto:

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

Esta no es una solución completa sin embargo. Depende un poco de lo que su end()estado de iterador se supone que es.

Sin embargo, parece que no son más eficientes y formas más intuitivas de la implementación operator++. STL, por ejemplo, le permite borrar entradas en un árbol y sólo iteradores invalidantes que apuntan a ese nodo. En su caso, todos los iteradores tendrían que ser invalidado.

Respondida el 05/04/2011 a las 02:46
fuente por usuario

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