最近我试图构建一个循环链表。我遇到了一件奇怪的事。似乎我的列表中的对象被删除了两次,但没有给出错误。但我不确定。 我的节点结构定义为:
class Node
{
public:
int i;
inline Node(int);
~Node() {}
Node *next;// point to the next node
};
Node::Node(int j):i(j), next(0)
{}
在我的链表中,我有我的追加方法,用于向尾部添加元素:
void SLList::append(Node* pnew)
{
nElmts++;
if(!last_)
{
last_ = pnew;
last_->next = pnew;
}
else
{
pnew ->next = last_->next;
last_ = last_->next = pnew;
}
}
还有我删除头部的removeHead方法:
void SLList::removeHead()
{
nElmts--;
if (!last_) //warning needed
{
abort();
}
Node* f = last_->next;
if(last_ == f)
{
last_->next = 0;
last_ = 0;
}
else
last_->next = f->next;
delete f;
}
列表类的析构函数:
~SLListBase()
{
clear();
}
和
inline void SLList::clear()
{
while(nElmts)
{
removeHead();
}
}
在我的测试运行中,我构建了三个Node *对象并将它们附加到列表中。
SLListBase list = SLListBase();
Node *newNode =new Node(1);
Node *newNode1 = new Node(2);
Node *newNode2 = new Node(3);
list.append(newNode);
list.append(newNode1);
list.append(newNode2);
工作得很好。元素一个接一个地添加到尾部。后来我发现我不小心保留了以前删除的删除行。
delete newNode;
delete newNode1;
delete newNode2;
我的问题是:当列表超出范围时,它将被删除并且将调用其析构函数。在其析构函数中,它将尝试通过调用removeHead再次删除其元素,因为它的元素变量nElmts的数量不为零。怎么可能没有错误?任何人都可以帮忙看看吗?感谢。