On Tue, 23 Apr 2002 09:34:34 -0400 Nick Orlov <[EMAIL PROTECTED]> wrote:
NO> 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 () у списка гарантируется при использовании неконстантных >> > функций. >> > Или все таки гарантируется, Влад? NO> Segfault возникает потому что p показывает черти куда после очередного NO> push_back. NO> Да и вообще написано криво дальше некуда. Ага. :) NO> Как Вы себе это представляете? Если не дошли до end() отодвинем end() ?? NO> Так что никакие списки здесь не помогут (будет все падать по bad_alloc). Хехе, вместо "while (p != paths.end ())" тут вообще надо "if (paths.end() != p) while (true)" поставить, так как если на каждой итерации цикла добавлять 1 элемент и на 1 же элемент продвигать итератор (там автор в конце цикла "++p;" писал), этот цикл закончится только вместе с памятью (в смысле память тоже закончится или лимит на нее). Как ты и писал, bad_alloc. В общем, довольно странная функция. Оценка максимального размера вектора на данной машине что ли? :) -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]