当std :: iterator在其边界(结束)之外访问时会发生什么?

时间:2019-03-16 19:09:04

标签: c++ vector stl iterator

我试图运行以下代码来检查迭代器的可访问性:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> n = {1,24,5,4};
    vector<int> :: iterator itr;

    itr = n.begin();
    for(;;itr++){
        cout<<*itr<<endl;
    }
    return 0;
} 

该程序已执行并退出,最后出现分段错误。 我从中了解到,直到某些迭代,迭代器返回的值在其边界之外且在程序崩溃后均为零。 我想知道当我们在迭代器的边界之外访问迭代器时会发生什么,并且如果它像指针一样工作,它指向什么?

1 个答案:

答案 0 :(得分:1)

任何事情都可能发生。这是未定义行为,不需要编译器执行任何特定操作。实际上,如果您的程序包含UB 任意位置,则可以将您的整个程序视为无效程序并发出所需的任何代码

一旦您违反了语言规则(例如取消引用指向越界对象的迭代器),就离开了定义明确的C ++领域,您将不再拥有 any 对行为的期望。