在更改項目平臺時(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,這樣就不會出現越界問題。