Итерации по вектору вызывают ошибку, но стандартный цикл for не - PullRequest
5 голосов
/ 30 марта 2012

У меня есть vector, который содержит указатели на абстрактный тип Rock:

vector<Rock*> rocks;

Если я перебираю вектор с помощью итератора, а затем пытаюсь получить доступ к объекту (неабстрактный класскоторый расширяет Rock) через итератор, я получаю ошибку 'EXC_BAD_ACCESS' в XCode 4:

vector<Rock*>::iterator rockIter;
for (rockIter = rocks.begin(); rockIter != rocks.end(); ++rockIter)
{
  bullet.hit(*(*rockIter));
}

Но циклически проходя через него, как обычно, проблем нет:

for (int i = 0; i < rocks.size(); i++)
{
  bullet.hit(*rocks[i]);
}

функция hit() выглядит следующим образом:

bool Bullet::hit(Rock & rock)

Я думал, что *(*rockIter) и *rock[i] будут делать то же самое, но ясно, что они этого не делают.Чем отличается, и как я могу передать ссылку на объект в векторе через итератор, как я делаю с *rock[i]?

1 Ответ

7 голосов
/ 30 марта 2012

Не видя больше кода, я не уверен, в этом ли проблема, но действительно ли код в bullet.hit() изменяет вектор путем добавления элементов? Если это так, и вы перебираете его, используя iterator, этот итератор станет недействительным, и любые будущие разыменования на нем приведут к неопределенному поведению. Однако использование стандартного цикла на основе int не вызовет этой проблемы, поскольку доступ по индексу не может быть признан недействительным.

Надеюсь, это поможет!

...