Я пишу тестовый код, чтобы узнать, может ли итератор вектора быть за итератором конца(), как это.Почему итератор вектора STL указывает на элемент, который не существует?
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> v;
v.push_back(100);
cout << v.capacity() << endl;
vector<int>::iterator itr = v.begin();
for (int i = 0; i < 10000; ++i, ++itr)
if (itr == v.end()) cout << "end at " << i << endl;
cout << *itr << endl;
return 0;
}
результат печати:
1
end at 1
0
вектор v объект имеет только один потенциал, но его итератора может получить доступ к памяти после того, как конец() итератора. Есть ли защита для этой ситуации?
Это неопределенное поведение, и стандартные мандаты не защищают от этого. – juanchopanza
Вы имеете в виду кроме того * не * делает это? – WhozCraig
Потому что он добавляет накладные расходы для проверки. –