Ошибка с std::list::iterator
От: vi.k  
Дата: 04.06.10 06:58
Оценка: :))) :)
Алгоритм действий примерно следующий:
iter = list.find()
if (iter != end()) {...}
list.insert(..)
if (iter == end()) {...}

В последней строчке иногда (!) с очень разной периодичностью вылетает ошибка

Что может быть?
Re: Ошибка с std::list::iterator
От: Bell Россия  
Дата: 04.06.10 07:22
Оценка:
Здравствуйте, vi.k, Вы писали:

VK>Алгоритм действий примерно следующий:

VK>iter = list.find()
VK>if (iter != end()) {...}
VK>list.insert(..)
VK>if (iter == end()) {...}

VK>В последней строчке иногда (!) с очень разной периодичностью вылетает ошибка


VK>Что может быть?


Вот если честно — на что ты рассчитываешь при таком вопросе? Что тут одни телепаты?
Любите книгу — источник знаний (с) М.Горький
Re: Ошибка с std::list::iterator
От: Sni4ok  
Дата: 04.06.10 07:27
Оценка:
Здравствуйте, vi.k, Вы писали:

VK>Алгоритм действий примерно следующий:

VK>iter = list.find()
VK>if (iter != end()) {...}
VK>list.insert(..)
VK>if (iter == end()) {...}

insert у листа — не константная операция, тоесть итераторы после неё могут быть не валидны(в частности если iter до insert'а был end() -ом)
Re[2]: Ошибка с std::list::iterator
От: Bell Россия  
Дата: 04.06.10 07:29
Оценка: +2
Здравствуйте, Sni4ok, Вы писали:

S>insert у листа — не константная операция, тоесть итераторы после неё могут быть не валидны(в частности если iter до insert'а был end() -ом)

Это не так.
Любите книгу — источник знаний (с) М.Горький
Re[3]: Ошибка с std::list::iterator
От: Sni4ok  
Дата: 04.06.10 09:28
Оценка:
Здравствуйте, Bell, Вы писали:

S>>insert у листа — не константная операция, тоесть итераторы после неё могут быть не валидны(в частности если iter до insert'а был end() -ом)

B>Это не так.

был не прав, каюсь.
Re: Ошибка с std::list::iterator
От: Acteon  
Дата: 04.06.10 09:32
Оценка:
Ждем минимального неработающего примера.
Re: Ошибка с std::list::iterator
От: Oleg Bekhter Украина www.bekhter.net
Дата: 06.06.10 08:58
Оценка:
Здравствуйте, vi.k, Вы писали:

VK>Алгоритм действий примерно следующий:

VK>iter = list.find()
VK>if (iter != end()) {...}
VK>list.insert(..)
VK>if (iter == end()) {...}

VK>В последней строчке иногда (!) с очень разной периодичностью вылетает ошибка


VK>Что может быть?

Телепаты в отпуске...
если в
if (iter != end()) {...}

ничего не делаешь с iter и list — тогда multithreading
Best regards,
Oleg Bekhter
Software Developer
Re[2]: Ошибка с std::list::iterator
От: vi.k  
Дата: 06.06.10 21:59
Оценка:
Здравствуйте, Bell, Вы писали:

B>Что тут одни телепаты?


Видимо, да. Сам немного удивлён, но я получил ответ на свой вопрос. Всем ответившим спасибо

Минимальный неработающий код, к сожалению, невозможен. Всё это происходит в моём классе, который использует и list, и map и т.д, и т.п.
+ multithreading. Ошибка вылетает через несколько часов стабильной работы. Что тут ещё подробнее скажешь?

Больше интересовало — правомерно ли использование итератора и end() после вставки. Поэтому реакция ответивших была самым лучшим ответом
Понял, что правомерно, так что ищу ошибку в другом месте.


Но, если можно, ещё вопрос:
не могу разобраться со splice. Правомерно ли после него использовать итератор, не участвовавший в splice?

void splice(iterator where, list& right, iterator first);

В частности тот, который where.
Re[3]: Ошибка с std::list::iterator
От: Bell Россия  
Дата: 07.06.10 02:48
Оценка:
Здравствуйте, vi.k, Вы писали:

VK>Но, если можно, ещё вопрос:

VK>не могу разобраться со splice. Правомерно ли после него использовать итератор, не участвовавший в splice?

VK>void splice(iterator where, list& right, iterator first);


VK>В частности тот, который where.


Да, можно — ломаются только ссылки на элемент, участвующий в splice

23.2.2.4/7
...Invalidates only the iterators and references to the spliced element.

Любите книгу — источник знаний (с) М.Горький
Re[4]: Ошибка с std::list::iterator
От: vi.k  
Дата: 07.06.10 22:17
Оценка:
Здравствуйте, Bell, Вы писали:

B>Да, можно — ломаются только ссылки на элемент, участвующий в splice


B>

B>23.2.2.4/7
B>...Invalidates only the iterators and references to the spliced element.


Хороший текст, сразу понятно даже с моим английским.
У меня хелп Билдера — там мне непонятно было.

Так понимаю — это стандарт? Можете дать ссылку?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.