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

Re: g++



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 () у списка гарантируется при использовании неконстантных функций.
> Или все таки гарантируется, Влад?

 Ну end() будет вызываться на каждой итерации, так что его константность не
требуется.
 А begin() - всегда один и тот же (если в цикле не звать push_front и не
удалять 1ый эл-т) - это же список. Иначе всякие splice'ы работать не смогут.

 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: