如何检测和隔离C ++访问冲突错误

时间:2010-12-28 10:29:31

标签: c++ visual-c++ access-violation

我在开发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

3 个答案:

答案 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容器的访问。