在更改项目平台时(vc6.0 -> vs2005)遇到一个错误,经过调试发现原因如下。

问题描述:有两个vector,一个是自定义类型CROI,一个是int型,用for循环将vector<int>中保持的索引去掉vector<CROI>中对应的项,用的是函数erase。

代码描述:

  1. //optMassIdx是int型的vector,regions是CROI型的vector  
  2. for(i=0;i<optMassIdx.size();i++)  
  3. {   
  4.     regions.erase(regions.begin()+optMassIdx[i]-i,regions.begin()+optMassIdx[i]-i+1);  

错误描述:在当regions.begin()+optMassIdx[i]的值大于regions的大小时,vs2005下会报错,vc6.0不报错。

原因分析:编译器先计算regions.begin()+optMassIdx[i],越界后马上报错。

修改代码:

  1. //optMassIdx是int型的vector,regions是CROI型的vector  for(i=0;i<optMassIdx.size();i++)    
  2. {         
  3.       regions.erase(regions.begin()+(optMassIdx[i]-i),regions.begin()+(optMassIdx[i]-i+1));    
  4. }  

总结:

修改后问题解决,只在regions.begin()+optMassIdx[i]计算前,先计算optMassIdx[i]-i,这样就不会出现越界问题。