On Tue, 23 Apr 2002, Nick Orlov wrote: > 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).
Естественно упомянутый пример упал бы если бы там были и списки - но упал бы от нехватки памяти (ядро бы его прибило), но не от SEGV. Но пример лишь иллюстрировал проблему, реальный код бы имел условное добавление элемента в конец. Best regards, -Vlad -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]