Возникло исключение: нарушение прав чтения this-> pCurr было 0xDDDDDDDD - PullRequest
1 голос
/ 05 марта 2020

Я новичок и работаю над связанным списком. Я пытаюсь сделать метод, который удаляет текущую ссылку в списке. Я получаю исключение: нарушение прав чтения this-> pCurr было 0xDD DDDDDD.

Так выглядит мой код (я удалил некоторые методы, такие как добавление ссылок, и оставил только связанные на удаление)

template <class T>
struct TNode {
    T val;
    TNode<T> *pNext;
};
template <class T>
class TList {
protected:
    TNode <T> *pFirst, *pLast, *pCurr, *pPrev, *pStop;
    int len; //lenght
    int pos;//where pCurr shows
public:
    //constructor
    TList() {
        pFirst = NULL;
        pLast = NULL;
        pCurr = NULL;
        pPrev = NULL;
        pStop = NULL;
        len = 0;
        pos = 0;
    }
    //destructor
    ~TList() {
        TNode<T> *tmp = pFirst;
        //if (tmp == pStop)
            //delete tmp;
        while (pFirst != pStop) {
            pFirst = pFirst->pNext;
            delete tmp;
            tmp = pFirst;
        }
    }
    //delete first link
    void DelFirst() {
        T res = pFirst->val;
        TNode<T> *tmp;
        tmp = pFirst;
        pFirst = pFirst->pNext;
        delete tmp;
        len--;
    }
    //delete current link
    void DelCurr() {
        if (pCurr == pFirst)
            DelFirst();
        else {
            TNode<T> *tmp = pCurr;
            pPrev->pNext = pCurr->pNext; // an exception is thrown on this line
            pCurr = pCurr->pNext;
            delete tmp;
            len--;
        }
    }
    //set pCurr to the beginning
    void Reset() {
        pCurr = pFirst;
        pPrev = pStop;
        pos = 0;
    }
    //go to the next link
    void GoNext() {
        //if (IsEnd()) throw - 1;
        //else {
            pPrev = pCurr;
            pCurr = pCurr->pNext;
            pos++;
        //}
    }
    //end check
    bool IsEnd() {
        return (pCurr == pStop);
    }
    //delete the whole list
    void DelList() {
        for (Reset(); !IsEnd(); GoNext()) {
            DelCurr();
        }
        DelCurr();
    }
};

Скажите, пожалуйста, с чем связано это исключение и как его исправить.

1 Ответ

0 голосов
/ 05 марта 2020

Проверка на нулевые указатели везде

А в функции DelFirst () установите pCurr на следующее, когда оно указывает на pFirst

void DelFirst()
{
    if (pFirst == NULL)
    {
        return;
    }
    if (pCurr == pFirst)
    {
        pCurr = pFirst->pNext;
    }
    T res = pFirst->val;
    TNode<T>* tmp;
    tmp = pFirst;
    pFirst = pFirst->pNext;
    delete tmp;
    len--;
}
...