В ответ на ваши изменения, да, я думаю, вы правильно его диагностировали.
Ваш код немного сбивает с толку (в основном потому, что вы даете имя obj
как указателю объекта, так и итератору, ссылающемуся на него).к его ячейке в списке), но эта строка:
m_objGrid[x][y].remove( obj );
, где вы удаляете объект obj
, сделает недействительным итератор obj
в вызывающей функции.Как видно из вывода valgrind, удаление объекта приводит к тому, что список удаляет ячейку, содержащую указатель объекта, на что ссылается итератор obj
.Таким образом, итератор obj
становится недействительным.Затем, когда вызов возвращается, самое следующее, что происходит, - это приращение цикла:
++obj
Здесь obj
- это итератор, который был просто недействителен, и его ссылочная ячейка была удалена в вызове к AdjustGridCoord
.Это вызывает доступ к памяти, которая была освобождена, на что жалуется valgrind.
У вас есть два варианта:
- Перестройте ваш цикл, чтобы получить последующийитератор до вы вызываете
AdjustGridCoord
- Выполните итерацию по списку один раз и запишите, какие изменения необходимо внести в какую-то другую структуру данных, а затем выполните второй цикл над этим вторичным "списком изменений"", и внутри этого цикла на самом деле вносить эти изменения в исходный список.
Примером 2 может быть создание std::vector<std::pair<unsigned int, unsigned int> >
, содержащего координаты, которые вам нужно вызвать AdjustGridCoord
наи затем выполните итерацию, чтобы сделать вызовы.