On Tue, Apr 23, 2002 at 01:37:12PM +0500, Vlad Harchev wrote: > On Tue, 23 Apr 2002, Alexei Khlebnikov wrote: > > > On Tue, 23 Apr 2002 08:40:43 +0400 > > Andrew Saunders <[EMAIL PROTECTED]> wrote: > > > > AS> Столкнулся вот с какой ерундой: по логике (моей) этот кусок кода > > AS> работать должен. Всё компилируется, однако, при запуске программы > > AS> случается segfault. > > > > AS> void f() > > AS> { > > > > AS> vector<string> paths; > > AS> paths.push_back("1"); > > > > AS> cout << "loop..." << endl; > > > > AS> vector<string>::iterator p = paths.begin(); > > AS> while (p != paths.end()) { > > AS> cout << "\t" << *p << endl; > > > > AS> paths.push_back(p, "2"); > > AS> ^^^^^^^^^^^^^^^^^^^^^^^^ > > AS> this is the place of segfault > > > > В этой строчке ты вызываешь функцию, которая изменяет состояние контейнера > > paths > > (не const функцию). При этом могут поменяться значения paths.begin () и > > paths.end () . Получается, в условии while ты сравниваешь p неизвестно с > > чем. > > Один из способов решения проблемы - перевычислять p и paths.end () при > > каждом > > path.end() и так перевычисляется. > > > добавлении. Другой - доступаться к элементам вектора через [индекс]. > > Да, доступ через [] тоже решает проблему. > > > Тут еще Влад Харчев советовал std::list использовать. Я не уверен, что > > неизменность > > begin () и end () у списка гарантируется при использовании неконстантных > > функций. > > Или все таки гарантируется, Влад?
Segfault возникает потому что p показывает черти куда после очередного push_back. Да и вообще написано криво дальше некуда. Как Вы себе это представляете? Если не дошли до end() отодвинем end() ?? Так что никакие списки здесь не помогут (будет все падать по bad_alloc). > > Ну end() будет вызываться на каждой итерации, так что его константность не > требуется. > А begin() - всегда один и тот же (если в цикле не звать push_front и не > удалять 1ый эл-т) - это же список. Иначе всякие splice'ы работать не смогут. > > Best regards, > -Vlad > > > -- > To UNSUBSCRIBE, email to [EMAIL PROTECTED] > with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED] > > -- With best wishes, Nick Orlov. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]