【发布时间】: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->pNext = pCurr->pNext;如果 pCurr 为空,你认为会发生什么? -
@theWiseBro 这是否意味着指针不指向任何东西并且列表为空?也就是说,我分配了一个指向任何东西的指针,因此出现错误?我将尝试在方法的开头添加一个列表检查是否为空。
标签: c++ exception linked-list destructor