c ++我的程序在调用list.erase之后"go"而没有增量迭代器?

Avi*_*ano 2 c++

新的cpp.当我调用擦除迭代器而不增加它时,我的程序立即退出而没有任何符号或崩溃.在下面的示例中,仅打印'After if condition'而不是任何内容.没有显示错误.但是,如果我正确调用 list.erase(it ++); 比打印全部. 我的问题是当我没有把它称为正确时发生的事情.为什么我没有看到任何崩溃或退出?我担心,我问这个问题的原因是为了捕捉这些崩溃,为什么我没有在捕获区中捕获它?有没有办法抓住它?

int main(int argc, char *argv[]) {
    try {
        list<int>::iterator it;
        list<int> list;
        list.push_back(1);
        for (it = list.begin(); it != list.end(); ++it) {
            if ((*it) == 1) {
                list.erase(it);
            }
            cerr << "After if condition " << endl;
        }
        cerr << "After for condition" << endl;
    } catch (...) {
        cerr << "catch exception" << endl;
    }
    cerr << "Finish" << endl;
}
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 6

来自std::list::erase():

擦除元素的引用和迭代器无效.

it被删除,然后通过++it导致未定义的行为使用:意味着任何事情都可能发生.

erase()返回最后一个删除元素之后迭代器,这意味着您可以存储返回值erase()和continue,但循环需要修改以避免erase()在执行后跳过元素.

  • @ user1495181,请参阅我的回答:_undefined behaviour_. (2认同)