删除链接列表

时间:2010-11-06 11:27:54

标签: c++ linked-list

嘿,我不知道 我编写了一个C ++链表,我在其中调用析构函数来遍历已分配的链表并删除找到的每个节点。然而,我发现虽然它通过链表并删除每个出现它仍然会打印出值。虽然只是一些废料值。

但是当我删除linked_list时它不应该是下次不能打印的吗? 我在删除列表时使用newdelete创建了一个链接列表

sorted_list::~sorted_list()
{
    // Destructor implementation
    destroy(this->first);
    cout << "Destructor called sorted_list" << endl;
}

void sorted_list::destroy(list_link* item)
{
  if (item)
  {
    destroy(item->next);
    delete item;
  }
}

打印功能

void sorted_list::print() {

    if(this->first)
    {
        iteratorn *traverse = new iteratorn(this->first);
        while( !traverse->iterator_end() )
        {
            cout << traverse->iterator_get_key() << " ";
            traverse->iterator_next();
        }
        delete traverse;
    }
    else
        cout << "list empty" << endl;
}

3 个答案:

答案 0 :(得分:14)

访问被破坏的对象时,行为未定义。实际上,删除对象并不会清除内存,只是将其标记为可用,因此如果对已经删除的对象执行某些操作,它们可能会做一些合理的操作。但同样,该对象被破坏,因此您不能访问它。

当然,在破坏后,你不应该保留任何属于链表的对象的指针,因为这些对象也会被破坏。

顺便说一句,你的sorted_list::destroy是递归的,这是非常低效的。您可能需要用迭代方法替换它:

void sorted_list::destroy(list_link* item)
{
    while (item)
    {
        list_link* old = item;
        item = item->next;
        delete old;
    }
}

(你应该考虑@Roger Pate的评论,而不是在致电this->first后第二次删除destroy(this->first);。)

答案 1 :(得分:0)

声明链接时,可能看起来或多或少像这样:

struct list_link {
    int data;
    list_link *next;
};

你可以在析构函数中删除

struct list_link {
    int data;
    list_link *next;
    ~list_link() { delete next; }  // MAKE SURE NULL-TERMINATED LIST
};

这种方式如果你想删除列表,你可以简单地:

delete first;

MAGIC !!

答案 2 :(得分:0)

缺少部分无效。删除后,您必须至少使第一个节点无效。删除后我会使每个节点无效。