Итератор массива не разыменованная ошибка
Существует пример кода, в котором возникает ошибка, как показано ниже. В режиме релиза он работает и печатает пять '-'. Однако в режиме отладки он не работает и возникает ошибка времени выполнения, которая является "итератором массива, не разыменованным".
сведения об окружении: Windows 7, 64-разрядная версия Visual Studio 2015, обновление 2
Я не знаю, почему существуют различия между выпуском и режимом отладки. Заранее спасибо.
#include <iostream>
#include <array>
static bool operator != (int * a, std::array<int, 5>::iterator &b)
{
return a != &(*b);
}
int main(void)
{
std::array<int, 5> arr = { 0,0,0,0,0 };
for (auto* it = &arr[0]; it != arr.end(); it++)
{
std::cout << "-" << std::endl;
}
return 0;
}
2 ответа
Ты звонишь *b
когда b
является arr.end()
, Это вызывает неопределенное поведение. Вы можете использовать только *
на итераторе, который ссылается на элемент массива.
Перегрузка операторов требует, чтобы хотя бы один операнд был классом или типом перечисления. std::array<int, 5>::iterator
это просто typedef для int*
, который является встроенным типом. Вам не нужно перегружать оператор сравнения, так как сравнения между указателями уже четко определены.
Рекомендации:
https://isocpp.org/wiki/faq/intrinsic-types
https://gcc.gnu.org/onlinedocs/libstdc++/manual/iterators.html