普通C ++代码导致不确定的结果[重复]

问题描述 投票:0回答:1

我有这样的代码:

    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;
    }

运行它,发现有时它永远不会结束,有时会打印出非常大或小的数字,有时会抛出“堆-缓冲区-溢出”。有人可以解释吗?

c++
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.