Re: g++
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 () при каждом
добавлении. Другой - доступаться к элементам вектора через [индекс].
Тут еще Влад Харчев советовал std::list использовать. Я не уверен, что неизменность
begin () и end () у списка гарантируется при использовании неконстантных функций.
Или все таки гарантируется, Влад?
AS> ++p;
AS> }
AS> cout << "end..." << endl;
AS> }
--
To UNSUBSCRIBE, email to debian-russian-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Reply to:
- Follow-Ups:
- Re: g++
- From: Vlad Harchev <hvv@hippo.ru>
- Re: g++
- From: Daniel Ginsburg <dg@sunet.ru>
- References:
- g++
- From: Andrew Saunders <dasdeine@pisem.net>