首页 > 解决方案 > 普通C++代码导致结果不确定

问题描述

我有这样的代码:

    vector<int> v = {1,-2,-2,3};
    int gsum = 0; //global sum
    for(auto i=v.begin(); i!=v.end(); ){
        if(*i >= 0){
            gsum += *i;
            v.erase(i,i+1);
        }else{
            v.insert(i, gsum);
            gsum = 0;
            i+=2;
        }
    }for (auto i : v) {
        cout<<i<<ends;
    }

运行它,发现有时它永远不会结束,有时它会打印极大或极小的数字,有时它会抛出“heap-buffer-overflow”。谁能解释一下?

标签: c++

解决方案


v.erase(i,i+1)行使所有迭代器无效v-包括您的for循环用于迭代容器的那些。因此,在该行之后,您的循环使用了无效的迭代器,并且您的代码具有未定义的行为


推荐阅读