[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: g++



On Tue, 23 Apr 2002 09:34:34 -0400
Nick Orlov <nick.orlov@mail.ru> 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 <dasdeine@pisem.net> 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 debian-russian-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org



Reply to: