【问题标题】:Exception thrown: read access violation this->pCurr was 0xDDDDDDDD抛出异常:读取访问冲突 this->pCurr 为 0xDDDDDDDD
【发布时间】:2020-06-17 22:52:30
【问题描述】:

我是一名初学者,正在研究链表。我正在尝试制作一种删除列表当前链接的方法。我遇到了一个异常:读取访问冲突 this->pCurr 为 0xDDDDDDDD。

这是我的代码的样子(我删除了一些方法,例如添加链接,只留下与删除相关的那些)

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

请告诉我这个异常与什么有关以及如何解决它。

【问题讨论】:

  • 在这一行pPrev-&gt;pNext = pCurr-&gt;pNext; 如果 pCurr 为空,你认为会发生什么?
  • @theWiseBro 这是否意味着指针不指向任何东西并且列表为空?也就是说,我分配了一个指向任何东西的指针,因此出现错误?我将尝试在方法的开头添加一个列表检查是否为空。

标签: c++ exception linked-list destructor


【解决方案1】:

到处检查空指针

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

【讨论】:

  • 我有一个链表,当 pCurr = pStop 时链表结束。我可以检查 pStop 而不是 NULL 吗?
  • 你能解释一下为什么我需要在 next 指向 pFirst 时安装 pCurr 吗?它有帮助,但我不太明白它是如何工作的。
  • 在您的示例代码中,pStop 设置为 NULL 并保持不变。所以 pStop 只是 NULL 的别名(所以也许 pStop 变量是不必要的?)。是的,您也可以使用它来检查 NULL,直到您不会将 pStop 值用于其他内容。
  • 如果你调用 DeleteFirst(),它会从列表中删除第一个元素。在这种情况下,如果 pCurr 指向 pFirst(已删除),它将是一个悬空指针 ~ 指向已释放的内存位置的指针。之后调用DeleteCurr(),尝试使用pCurr,无效
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 2017-01-27
  • 2016-08-25
  • 2018-11-16
  • 2023-04-02
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多