C ++ - GDB chyby Otázka

hlasů
1

Pracuji na strom binárního vyhledávání v C ++. Začínám následující chyby hlášené po spuštění gdb (mám příjem segfault) na svém programu:

#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

Chyba # 0 se vztahuje k mé funkci getLeft (), která je takto:

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

Došlo k chybě # 1 odkazuje na mé operátora ++ definované v mých iterátorů, což je následující:

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

Došlo k chybě # 2 se týká mého hlavního programu, ve kterém jsem včetně souboru, který obsahuje své definice tree_node, binaryTree, bst_iter a bst_citer (který neexistuje v tomto bodě, a tak není problém).

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

Nejsem si úplně jistý, co je příčinou chyby. Domnívám se, že ++ () se pokouší o přístup do oblasti, která nebyla definována, ale nejsem si úplně jistý, proč to dělá to, nebo jak to zastavit ... Snažil jsem se držet zpátky na kódu, jako kód je téměř 800 linek dlouho, ale pokud je potřeba více informací, dejte mi vědět ...

Položena 05/04/2011 v 02:32
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Jak se vám Inicializace pro smyčce iterátorem i? Pokud je to neplatný začít, pak by to vysvětlit věci.

Odpovězeno 05/04/2011 v 02:36
zdroj uživatelem

hlasů
0

To by mohlo nastat, pokud pos _-> GetRight () vrací ukazatel null.

Vzhledem k tomu, voláte getLeft na výsledku bez kontroly jej null, můžete skončit s tímto ukazatelem, který je nulový.

Odpovězeno 05/04/2011 v 02:46
zdroj uživatelem

hlasů
0

Jak můžete vidět v gdb vzadu stopy, můžete skončit volání getLeft()na ukazatel NULL. tedy jeho tento ukazatel NULL.

Ve vašem obvodu uvnitř operator++, zavoláte getLeft()na pbez předchozí kontroly, pokud je to NULL. tedy pokud getRight()se vrátí NULL, budete padat.

Pravděpodobně budete chtít udělat něco takového:

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

Nejedná se o kompletní oprava ačkoli. Záleží trochu na to, co váš end()stav iterátoru má být.

Nicméně se zdá, že existují účinnější a intuitivní způsoby provedení operator++. STL například umožňuje odstranit záznamy v stromu a jen zneplatnění iterátory ukazující na tomto uzlu. Ve vašem případě, všechny iterátory by musela být zrušena.

Odpovězeno 05/04/2011 v 02:46
zdroj uživatelem

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