在更改项目平台时(vc6.0 -> vs2005)遇到一个错误,经过调试发现原因如下。
问题描述:有两个vector,一个是自定义类型CROI,一个是int型,用for循环将vector<int>中保持的索引去掉vector<CROI>中对应的项,用的是函数erase。
代码描述:
- //optMassIdx是int型的vector,regions是CROI型的vector
- for(i=0;i<optMassIdx.size();i++)
- {
- 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],越界后马上报错。
修改代码:
- //optMassIdx是int型的vector,regions是CROI型的vector for(i=0;i<optMassIdx.size();i++)
- {
- regions.erase(regions.begin()+(optMassIdx[i]-i),regions.begin()+(optMassIdx[i]-i+1));
- }
总结:
修改后问题解决,只在regions.begin()+optMassIdx[i]计算前,先计算optMassIdx[i]-i,这样就不会出现越界问题。