Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1739325
  • 博文数量: 263
  • 博客积分: 1218
  • 博客等级: 少尉
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-19 02:33
文章分类

全部博文(263)

文章存档

2020年(12)

2019年(2)

2018年(10)

2016年(1)

2015年(20)

2014年(115)

2013年(46)

2012年(37)

2011年(20)

分类: C/C++

2014-06-06 17:27:53

自己的代码:
for(itFArg=m_vectFileThreadArg.begin(); itFArg!=m_vectFileThreadArg.end(); itFArg++ )
{
if(itFArg->nDataChannel == FArg.nDataChannel)
{
     m_vectFileThreadArg.erase(itFArg);  //if not assign to itFArg "if(itFArg == m_vectFileThreadArg.end()" may throw exception after some erase
    break;
}
}
if(itFArg == m_vectFileThreadArg.end())  // 这里报错
{

}
解决:  m_vectFileThreadArg.erase(itFArg);改成itFArg=m_vectFileThreadArg.erase(itFArg);就不会产生异常了
在网上找到以下资料:
由于平时迭代器与向量用的并不是很多,因此今天上午遇到了一个非常怪异的问题,浪费了我整整4个小时!心疼呀!!

       下面是详细经过,不想看经过的可略过直接看我的总结。

       我的项目需要处理非常复杂的数据结构,而且有很多结构都是自增长的,因此如果要想妥善的管理并处理这些数据就要有十几个不同的动态数组支持才行,为了使代码更加简洁,因此打算使用向量来代替动态数据。

       没想到就是这个看似合理的选择却给我带来了烦恼,在我调试到代码最复杂的地方,正当我的大脑频率与大脑缓存都异常吃紧时,突然弹出了一个让我摸不到头脑的错误,大脑直接宕机……

       这个错误是“vector iterators incompatible”,提示我向量与迭代器不兼容,但是这很明显是不可能的,我当时的代码大致如下:

 

--------------------------------------------------------------------------------

 

....

....

typdef struct _STRUCT

{

    ....

    ....

    vector vecInfo;

}STRUCT;

 

 

STRUCT stcStruct;

....

....

for (vector::iterator i= stcStruct.vecInfo.begin();

     i != stcStruct.vecInfo.end();

     i++) // 这里报错

{

   ....

   ....

}

 

--------------------------------------------------------------------------------

 

       由代码可知,我并没有使用任何其他类型的向量,仅有INFO这一个类型,怎会出现这个错误呢,百思不得其解,跟进库代码暂时也没有什么收获。

      没有办法,想Google大叔求助吧,网上给出了以下几种会引起此错误的情况,虽然对我没用,但还是整理出来,方便各位查阅:

1、类型不匹配,例如用int型的向量迭代器与char型的向量迭代器进行比对操作。

2、比对时向量结构发生变化,比如以下代码:

 

--------------------------------------------------------------------------------

 

for (vector::iterator i= vector.begin();

     i != vector.end();

     i++) // 这里报错

{

   vector.erase(i);

   ....

}

 

--------------------------------------------------------------------------------

 

       在erase操作后,没有将循环变量i指向修改后的向量迭代器,就继续循环,再与end()比较时断言出现。

       解决方法是将“vector.erase(i);”替换为“i = vector.erase(i);”,这是因为STL里的所有容器类中的erase实现都会返回一个迭代器,这个迭代器指向了“当前删除元素的后继元素,或是end()”。
转:http:///kf/201110/108902.html

阅读(2186) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~