程序有时会崩溃

时间:2011-03-12 07:13:10

标签: c++ pointers data-structures linked-list

以下例程应该在单个链表的开头删除节点,但有时会失败。

void remove_from_front(node *start)
{
    delete start;
    start = start->link;
    print_list(start);
}

3 个答案:

答案 0 :(得分:8)

我可以看到几个问题:

  1. 您正在释放start节点,然后访问已释放的内存。这是不正确的,它会导致未定义的行为,这意味着任何事情都可能发生。在一次运行中它可能会起作用,在下一次运行中它可能会崩溃。

  2. 您的函数需要对列表的头部进行更改,但它不会使更改对被调用函数可见,因为它不返回任何内容,并且参数start按值传递。要解决此问题,请传递start指针的地址或引用。

  3. 您的功能可能会在空列表start = NULL上调用。你需要处理这种情况。

  4. 正确实施:

    void remove_from_front(node **start) {
    
      // if list is empty..nothing to remove..return.
      if(*start == NULL) {
         return;
      }
    
      // save the address of the node following the start in new_start 
      node *new_start = (*start)->link;
    
      // now delete the start node.
      delete *start;
    
     // new_start is now the new start of the list.
     // And since start was passed by address, the change is reflected in the
     // calling function.
      *start = new_start;
    }
    

答案 1 :(得分:5)

delete start后,您无法安全地使用start所指的内容。这就像放下一个风筝线,并希望以后能够再次抓住它 - 它可能会起作用,也可能不会。

答案 2 :(得分:-1)

您正在删除start,然后尝试通过获取其链接成员来取消引用它。那会崩溃,因为你刚刚删除它。你可能想要这样的东西:

node *temp = start;
start = start->link;
delete temp;
print_list(start);