Необычное поведение при сравнении std :: list <myclass *> :: iterator - PullRequest
1 голос
/ 30 июня 2011

Я наблюдаю необычное поведение при сравнении двух итераторов.

vector<list<MyClass*>>   vlWatchers(10);
list<MyClass*>::iterator itCurrent, itEnd;

for (int i(0); i <= 9; ++i)
{
    itCurrent = vlWatchers[i].begin();
    itEnd = vlWatchers[i].end();
    while (itCurrent != itEnd)
    {
        //code
    }
}

приведет к ошибке несовместимости списков итераторов в строке while () и, вероятно, произойдет, когда i = 0, хотя тольконекоторое время.

При дальнейшем расследовании после вызова ошибки itEnd и itCurrent равны 0xcdcdcdcd.Странная часть, когда я вхожу в оператор! = Сравнения, указатель "this" становится 0xcdcdcdcd.Не должно ли 0xcdcdcdcd быть значением , которое хранится в итераторах, а не адресом самих итераторов?или есть какая-то черная магия итератора, где итератор и хранит значение, и ЕСТЬ значение?Это часть более крупного проекта, но ошибка повторяется.

Заранее благодарен за любую помощь!

1 Ответ

0 голосов
/ 30 июня 2011

Давайте следуем логической цепочке (предполагая, что первые несколько строк вашего цикла for точно такие же, как описано):

  • itCurrent->this == 0xcdcdcdcd, следовательно ...
  • itCurrent == 0xcdcdcdcd, следовательно ...
  • vlWatchers[i].begin() возвращено 0xcdcdcdcd, следовательно ...
  • vlWatchers[i] недействительно, поэтому возможно ...
    • i >= vlWatches.size() или
    • vlWatchers недействительно

Я как-то голосую за vlWatchers.size() == 0. Можете ли вы добавить проверку в ваш метод для обнаружения этого случая?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...