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

标签 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;
}

最佳答案

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

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

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

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

关于C++无法删除链表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37344686/

相关文章:

C++ 错误 : invalid conversion from Inheritance

c++ - 枚举 unique_ptr vector 的编译错误

c++ - 尝试在 C++ 中创建一个按时间顺序存储值而不是向后存储所有内容的单链表

C++ 深度复制链表

c++ - C++ int 的值神秘变化

c++ - 三重与号 `&&&` 在 C++ 中代表什么?

c++ - 使用 Hook Engine 时的 ACCESS_VIOLATION

linked-list - 二进制表达式 ('ostream' (又名 'basic_ostream<char>' )和 'void' )的无效操作数

c - 如何在函数调用时正确迭代链表

java - 如何合并排序具有 O(nlogn) 时间和 O(1) 空间复杂度的链表