Что происходит, когда к std :: iterator обращаются за пределами его границы (end)?

#c #vector #stl #iterator

#c #вектор #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. Это неопределенное поведение.

2. «Я хочу знать, что происходит, когда мы обращаемся к итератору за пределами его границы …» Вы, возможно, убили колыбель милых котят. Невозможно сказать, что происходит при вызове неопределенного поведения .

3. Хотя, справедливости ради, милые котята, вероятно, были одержимы носовыми демонами, так что скатертью дорога!

Ответ №1:

Все может случиться. Это неопределенное поведение, и компилятору не требуется делать что-либо конкретное. Фактически, разрешено рассматривать вашу всю программу как недопустимую и выдавать любой код, который он хочет, если ваша программа содержит UB где угодно.

Как только вы нарушаете правила языка (например, разыменовываете итератор, указывающий на что-то, что выходит за рамки), вы покидаете область четко определенного C , и у вас больше не может быть каких-либо ожиданий относительно того, каким будет поведение.

Комментарии:

1. Что ж, спасибо за ответ, да, понял его неопределенное поведение при обращении к итератору вне области видимости. Код не будет аварийно завершаться, когда я обращаюсь к небольшому числу итераций (скажем, 10), возможно, это доступ к значениям из произвольных местоположений.

2. @VikasRokade «Код не завершится сбоем, когда я обращаюсь к небольшому числу итераций (скажем, 10)» — На это нет гарантии . Это все еще UB и с другим компилятором, другими параметрами оптимизации, другой аппаратной платформой или просто немного другой средой выполнения, он вполне может дать сбой (или хуже; кажется, работает, беззвучно повреждает память и вылетает 10 часов спустя посреди ночи у вашего крупнейшего клиента).