none
visual studio 2008 调用vector的clear()函数 导致 "vector iterators incompatible"错误 RRS feed

  • 问题

  • visual studio 2008 调用vector的clear()函数 导致 "vector iterators incompatible"错误
    偶尔会出错,大部分时候不会。
    哪位兄弟也遇到过?
    knowledge is power
    2009年4月4日 10:08

答案

  • 如果你要略过这个检查,可以用#define _HAS_ITERATOR_DEBUGGING 0 不过建议还是检查线程的同步代码
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    2009年6月21日 16:17
    版主

全部回复

  • 只好这么做,就可以:
    while(!vec.empty() )
    {
      vec.pop_back();
    };

    knowledge is power
    • 已标记为答案 KeFang Chen 2009年4月10日 8:33
    • 取消答案标记 jinshan_hu 2009年4月11日 10:55
    2009年4月4日 10:14
  • clear()只做一件事就是调用通过iterator调用元素的析构函数。应该是iterator被你修改过。导致遍历的时候出现错误。
    2009年4月8日 3:26
    版主
  • 我没有修改过iterator。我是在多线程中使用,但是加了线程处理代码,理论上来讲是不应该出错的。
    程序也不是每次都出错,相反很少会出错,频繁调用代码段,有时运行一整天都没有问题。

    谢谢您的回复!
    knowledge is power
    2009年4月9日 4:09
  • 如果你要略过这个检查,可以用#define _HAS_ITERATOR_DEBUGGING 0 不过建议还是检查线程的同步代码
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful. This posting is provided "AS IS" with no warranties, and confers no rights.
    Visual C++ MVP
    2009年6月21日 16:17
    版主
  • 斑竹的回答很不敬业,因为vs 2008 对vector边界的检查很严格,当调用vector的erase或者clear时,有可能出现iterator越过vector的end的情况。而访问超过end的元素是未定义行为。在vc6.0中就没有这样的检查。
    2010年5月20日 8:21
  • 将vector的质变算法添加互斥操作。加锁
    麻烦把正确答案设为解答。
    2010年5月20日 9:14
    版主
  • 将vector的质变算法添加互斥操作。加锁
    麻烦把正确答案设为解答。


    加锁也没用,照样报错。

     

    while(!vector() )
    {
          vector.pop_back();
    };

    或者


         for( int i = 0, int length = vector.size(); i < length; i++ )
         {
             vector..erase( vector..begin() );
         }

     

    却正常。

     

    只能怀疑是源代码有 Bug。

    2011年4月7日 17:33