C ++无法删除链接列表中的节点

时间:2016-05-20 10:45:52

标签: c++ linked-list

我正在尝试使用 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;
}

1 个答案:

答案 0 :(得分:4)

删除指针不会影响指针是否保留在容器中。由于您尚未显示一个程序,该程序显示该节点仍然在列表中,因此我认为在调用erase之后它不会保留。

如果您使用new分配了指向的对象,则必须在某个时刻delete。如果在此处删除指针时程序崩溃,则意味着

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

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