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