c ++ map / set итератор не разыменовывается

Я хочу попросить вас о подсказке, так как я новичок и не нашел подходящего ответа в интернете.
Я получаю эту ошибку:
ошибка отладки — итератор сопоставления / набора не может быть разыменован
на линии, которая выглядит так:

pointA = active->pointNext(timeNext);

с функцией pointNext () как я вижу все ок и что касается активный, Я имею:

active = setS.data.end();

Еще немного информации:

активный является мультимножеством< classA, classB :: classC> :: const_iterator

наборы имеет: setS.Q, setS.W, setS.T а также setS.data,
согласно которому setS.data имеет внутри 0 в квадратных скобках.
Когда у меня есть декларация итератора мультимножества в файле .cpp, во время отладки я не могу войти, чтобы увидеть, что находится внутри активного, когда это находится в файле .h, я могу.

Имея в .cpp я не могу войти активный, поэтому можно представить, что указатель (итератор) не может разыменоваться, потому что внутри он неправильный. Что если оно пустое, т.е. если setS.data пустой? или если внутри есть какой-то мусор?

Я знаю, что раньше эта штука работала под Linux, есть ли какая-то особенность, которую я должен изменить для запуска на windows? Например, чтобы изменить количество параметров шаблона только на один? (правильно приписать setS.data в активный, потому что я не уверен — правильно ли я это делаю?

Извините за этот довольно хаотичный пост, я хотел добавить свои догадки, чтобы кто-то пренебрег им, если они ошибаются. Если что-то здесь неясно или не хватает какой-либо информации, я с удовольствием добавлю это.
Подскажите, пожалуйста, по каким причинам я могу получить ошибку разыменования и где ее искать? Потому что я застрял и не знаю, как поступить.

любая помощь очень ценится, спасибо!

5

Решение

Проще говоря, так как active указывает на контейнер end()Вы не можете разыменовать его.

Я знаю, что вещь работала под Linux ранее

Если код был именно таким и был «запущен», все это означает, что ошибка никогда не проявлялась так, как вы заметили.

9

Другие решения

Это ваша проблема:

active = setS.data.end();

Это возвращает итератор к одному переданному концу контейнера.
Таким образом, элемент, на который он указывает, недействителен. Вы не можете вызывать какие-либо методы для объекта, на который ссылается итератор.

Если вы сделали:

active = setS.data.end();
if (setS.data.begin() != active)
{
// make sure the set is not empty first
--active;
active->methodCall(); // This would be OK
}
3

Вы не можете разыменовать итератор, возвращаемый стандартной библиотекой end() функция, так как это «один за последним элементом». Обычно вы выполняете итерацию по допустимому диапазону, т.е. до ты достигаешь end():

for(someIteratorType it = setS.data.begin(); it != setS.data.end(); ++it)
{
it->someMethod();
}

Или в C ++ 11,

for (const auto& elem : setS.data)
{
elem.someMethod();
}
1

end () указывает на элемент после последнего элемента. поэтому end () не разыменовывается.

Вам нужно добавить проверку, чтобы увидеть, если вы в конце, и если вы, не разыменовывать его.

0
pointA = active->pointNext(timeNext);

пытается разыменовать «active» для вызова оператора -> (…), но active равен setS.data.end ();

end () возвращает итератор для элемента после конец контейнера. Поэтому вы не можете разыменовать это.

0
По вопросам рекламы [email protected]