【问题标题】:C++ unable to delete a node in a linked listC++ 无法删除链表中的节点
【发布时间】:2016-05-20 10:45:52
【问题描述】:

我正在尝试使用 mylist.erase(); 删除链接列表中的节点,但该节点仍保留在列表中。我尝试使用 delete() 但程序崩溃了。任何的想法?

list <Person*> :: iterator it;
it = gamelist.begin(); //gamelist is a <Person*> list. it is an iterator to this list.
while (it!=gamelist.end()){
    if ((*it)->is_dead == true) {
        delete (*it); //if I comment this line the program does not crash but the "dead" Person still remains in the list.
        it = gamelist.erase(it);
    }
    else ++it;
}

【问题讨论】:

  • 您好,您是否尝试过 gamelist.erase 然后删除?
  • 嗨@JuanPablo。是的,我试过了。同样的问题...
  • 你确定你newed 内存@*it 并且它还没有被释放吗?您可以尝试将*it 保存在临时的Person * 中,然后擦除并删除临时的。
  • 你为什么用Person *而不是一些智能指针?
  • 欢迎使用 C++。仅仅因为某些代码块在某个特定点崩溃,并不意味着这正是错误所在。没有minimal reproducible example,就无法回答您的问题。

标签: c++ linked-list


【解决方案1】:

删除指针对指针是否保留在容器中没有影响。由于您没有展示一个程序来证明该节点保留在列表中,我假设它在调用 erase 后不会保留。

如果你用new分配了指向的对象,那么你必须在某个时候delete它。如果在此处删除指针时程序崩溃,那意味着要么

  • 指针未初始化,从未指向有效对象。
  • 指针曾经有效,但指向的对象已经被销毁,指针不再有效。
  • 指针有效,但指向的对象不是用new 创建的。
  • 指向的对象未处于其析构函数所依赖的有效状态。

无法在程序中“测试”指针的有效性(除了检查它是否为空,但删除空是可以的并且不会崩溃,所以这不是你的问题)。您必须自己分析您的程序并保证其有效性。智能指针使推理指针的有效性变得容易得多。我建议你使用它们。

【讨论】:

  • 所以对于 Theo 来说,底线是你应该检查你的代码在哪里你 insert 元素到你的列表中,并确保它们是使用 new 创建的指针,或NULL.
  • @Sh3ljohn 在删除指针时永远不需要检查指针是否不为空。仅当指针非空时,指针才需要指向有效对象。
  • "在所有情况下,如果 ptr 是一个空指针,标准库释放函数什么都不做。" [C++ std] 我不知道,谢谢。我编辑了我之前的评论。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2016-03-02
  • 1970-01-01
  • 2019-05-10
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多