Что происходит при доступе к std :: iterator за пределами его границы (конца)? - PullRequest
0 голосов
/ 16 марта 2019

Я попытался запустить приведенный ниже код, чтобы проверить доступность итератора:

#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 Ответ

1 голос
/ 16 марта 2019

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

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

...