我试图运行以下代码来检查迭代器的可访问性:
#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;
}
该程序已执行并退出,最后出现分段错误。 我从中了解到,直到某些迭代,迭代器返回的值在其边界之外且在程序崩溃后均为零。 我想知道当我们在迭代器的边界之外访问迭代器时会发生什么,并且如果它像指针一样工作,它指向什么?
答案 0 :(得分:1)
任何事情都可能发生。这是未定义行为,不需要编译器执行任何特定操作。实际上,如果您的程序包含UB 任意位置,则可以将您的整个程序视为无效程序并发出所需的任何代码。
一旦您违反了语言规则(例如取消引用指向越界对象的迭代器),就离开了定义明确的C ++领域,您将不再拥有 any 对行为的期望。