Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;无法删除链接列表中的节点_C++_Linked List - Fatal编程技术网

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

C++ C++;无法删除链接列表中的节点,c++,linked-list,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_de

我正在尝试使用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;
}
list::迭代器;
it=gamelist.begin()//gamelist是一个列表。它是此列表的迭代器。
while(it!=gamelist.end()){
如果((*it)->is_dead==true){
删除(*it);//如果我注释这一行,程序不会崩溃,但“死亡”的人仍保留在列表中。
它=游戏列表。擦除(它);
}
否则它;
}

删除指针不会影响指针是否保留在容器中。由于您没有显示显示节点保留在列表中的程序,因此我假定在调用
erase
后它不会保留在列表中

如果为指向的对象分配了
new
,则必须在某个点将其删除。如果在此处删除指针时程序崩溃,则意味着

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

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

您好,您是否尝试删除gamelist.erase然后删除?您好@JuanPablo。是的,我试过了。同样的问题…您确定
new
ed了内存@
*它
并且它还没有被释放吗?您可以尝试在临时代码< >代码> >代码>中保存<代码> *它<代码>,删除和删除临时。为什么使用“代码>人*<代码>而不是一些智能指针?欢迎使用C++。仅仅因为某些代码块在某个特定点崩溃,并不意味着这正是错误所在。如果没有答案,你不可能回答你的问题。因此对于Theo来说,底线是你应该检查你在列表中插入元素的代码,并确保它们是用
new
创建的指针,或者
NULL
@Sh3ljohn删除指针时不需要检查指针是否为NULL。指针必须指向非空的有效对象。“在所有情况下,如果ptr是空指针,则标准库释放函数不会执行任何操作。”]我不知道,谢谢。我编辑了我以前的评论。:)