#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 часов спустя посреди ночи у вашего крупнейшего клиента).