对象似乎被删除了两次

时间:2015-04-19 16:35:45

标签: c++ linked-list

最近我试图构建一个循环链表。我遇到了一件奇怪的事。似乎我的列表中的对象被删除了两次,但没有给出错误。但我不确定。 我的节点结构定义为:

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的数量不为零。怎么可能没有错误?任何人都可以帮忙看看吗?感谢。

0 个答案:

没有答案