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

Re: g++



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 <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 () у списка гарантируется при использовании неконстантных функций.
> > > Или все таки гарантируется, Влад?
> 
> Segfault возникает потому что p показывает черти куда после очередного
> push_back.
> Да и вообще написано криво дальше некуда.
> Как Вы себе это представляете? Если не дошли до end() отодвинем end() ??
> Так что никакие списки здесь не помогут (будет все падать по bad_alloc).

 Естественно упомянутый пример упал бы если бы там были и списки - но упал бы
от нехватки памяти (ядро бы его прибило), но не от SEGV.
 Но пример лишь иллюстрировал проблему, реальный код бы имел условное
добавление элемента в конец.

 Best regards,
  -Vlad


--
To UNSUBSCRIBE, email to debian-russian-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org



Reply to: