删除链接列表

sta*_*orn 2 c++ linked-list

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

但是当我删除linked_list时它不应该是下次不能打印的吗?我通过使用new,delete当我删除列表时创建链接列表

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

打印功能

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;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*lad 14

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

当然,在破坏链接列表后,不应该保留任何指向链接列表的对象,因为这些对象也会被破坏.

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

void sorted_list::destroy(list_link* item)
{
    while (item)
    {
        list_link* old = item;
        item = item->next;
        delete old;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,总是迭代地销毁列表,因为如果列表太大,递归方法可能会耗尽堆栈空间. (6认同)