【C++】bug之vector subscript out of range

vector subscript out of range 是指vector下标越界,一般都是遍历下标出错导致越界访问。一般情况是手一滑就把循环边界写错。当然也有出乎意料的出错地方。

对vector进行遍历的时候经常这么写

vector<int>a;
//a.push_back(2);
//...
for(int i=0;i//a[i]
}

这里注意一点,a.size()是一个无符号整数,更加规范的写法是把i定义为size_t类型,也就是无符号整数。


出乎意料的情况

1.

for( size_t i = 0; i <= v.size()-1; i++)  
{  
        cout<  

若v.size()=0,也会出现下标越界,因为size=0,则size-1=-1,则此时二进制位全为1,但size-1是一个无符号整数,则变为 0232 0 − 2 32 范围的无符号整数,则其值为 232 2 32 ,所以上述代码在vector.size=0时会出现下标越界访问,当然一般size里不会等于0,但是若是出现在不停迭代变化的场景下如此写必然会出现错误。

预防方法:


可以在vector遍历时利用if添加对下标的检测,若出现错误则格外注意对于循环中设定的上下界进行输出检查。可以避免对未知内存访问以及更快定位出现错误的地方。

    vector<int >v;
    for (size_t i = 0; i <= v.size() - 1; i++)
    {
        if (i >= v.size() || i < 0) { cout << "vetcor下标越界" << endl; break; }
        cout << v[i] << endl;
    }


待续

你可能感兴趣的:(学习C++)