我在开发C ++应用程序时,
我使用的是一个简单的list<int> *somelist = new list<int>();
包含数据。
我试图使用类似的东西迭代这个列表:
for (list<int>::iterator j=somelist->begin();j!=somelist->end();j++)
{
//do something with *j
}
当我使用指针j
做某事时,由于连锁反应,我要访问的数据已从列表中删除,不再存在。
因此,我被提示访问冲突错误消息。
有人可以告诉我如何识别指针j
是否是一个糟糕的ptr
答案 0 :(得分:1)
无法完成。您必须在遍历期间不删除列表。
答案 1 :(得分:1)
您的代码中的错误是,当您仍然知道删除它时,您需要处理此问题。之后你再也无法处理了。在以下示例中,dosomething
在应删除元素时返回true
for (list<int>::iterator j=somelist->begin();j!=somelist->end();) {
if(dosomething(j)) {
/* should remove it! */
j = somelist->erase(j);
} else {
++j;
}
}
答案 2 :(得分:0)
使用多线程,如果某个其他线程从列表中删除元素,则迭代器可能会失效。使用C ++等低级编程,一旦发生问题就无法检测到这个问题。你最好的选择是“防止这种情况发生。”
使用同步功能(例如,Windows中的WaitForSingleObject
)来控制对共享STL容器的访问。