У меня есть этот кусок кода:Вектор получает итерация раза больше, чем размер()
for (std::vector<Marker>::iterator it = markers.begin(); it != markers.end(); ++it) {
if (it->getDots().size() < 3) {
markers.erase(it);
}
}
В одном из тестовых входов (приложение делает анализ изображения) я получаю Segfault. Я попытался отладить код (безрезультатно) и заметил одну вещь. При запросе gdb на p markers.size()
я получаю $9 = 3
. Поэтому я ожидал бы, что цикл будет повторяться три раза, но на удивление он делает это (по крайней мере) 5 раз. На пятой итерации есть segfault. Я также заметил, что это не разыменование *it
(здесь it->
), что вызывает ошибку. Это конкретно it->getDots()
, который является простым геттером.
Я пишу на C++ очень редко, поэтому это может быть какая-то простая ошибка, но ни моя отладка, ни поисковая система не принесли никакого решения. Не могли бы вы помочь?
Я хотел бы подчеркнуть, что на разных входах (несколько разных изображений) эта функция работает правильно, поэтому мне еще сложнее проследить ошибку.
Вы являетесь жертвой [аннулирования итератора] (http://stackoverflow.com/questions/3747691/stdvector-iterator-invalidation). – Mahesh
Не могу поверить, что в Интернете есть так много примеров об итераторских операциях, таких как «iterator-> doSomething()», но почти никто не включает предупреждение об этой особой ситуации, которая может быть довольно распространенной, поскольку удаление вещей из коллекции представляется довольно простой операцией. Но также и плохо, я должен был внимательно прочитать документацию. Спасибо вам, ребята! – Wojtek