Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работать с указателем


Автор: Rickert 20.7.2007, 06:05
Код

struct uTerminal
{
  uTerminal(){}
  ~uTerminal(){}
  aString last_boot;
};
...
vector<uTerminal> terms;
terms.push_back(uTerminal())
...
vector<uTerminal>::iterator ti;

ti = terms.end();

uTerminal* ftt = &(*ti);

ftt->last_boot.set("20.07.07");

Почему segmentation fault на последней строке?

Автор: Rickert 20.7.2007, 06:54
Блин, ну конечно же:
Код

uTerminal tff = *ti;

Только надо будет перегрузить оператор =.

Автор: Lazin 20.7.2007, 07:38
а разве terms.end() указывает не на следующий после последнего элемент.. Мне кажется лучше так:
Код

if ( ! terms.empty() )
  uTerminal tff = terms.back();

Автор: Rickert 20.7.2007, 07:58
Твоя правда!

Автор: Lazin 20.7.2007, 08:10
Цитата

Пример, который я привёл во втором посте проваливается segmentation fault

потому-что vector.end() указывает на следующий после последнего элемент, в STL итератор end() используется обычно в качестве NULL-pointer-a. Если нужен последний элемент, то back() - возвращает ссылку на него, а итератор:
Код

std::vector<uTerminal>::iterator i = terms.end();
--i;
uTerminal* ftt = &(*i);


Автор: Rickert 20.7.2007, 08:13
Хорошо, тогда смотри так:
Код

vector<uTerminal> tff;
vector<uTerminal>::iterator it;
...
for (it = terms.begin(); it != terms.end(); it++)
{
tff = *it;
...
}

Почему в этом случае у меня всегда идёт указание на последний элемент?

Автор: Rickert 20.7.2007, 08:36
:(

Автор: Lazin 20.7.2007, 08:42
Цитата

Почему в этом случае у меня всегда идёт указание на последний элемент?

Потому что тело цикла исполняется только в том случае, если it != terms.end(), т.е. для it == terms.end() присваивание не выполняется. Подумайте, если вектор пуст, то присваивание не должно выполняться ни разу, так-как в этом случае terms.begin() == terms.end().

Автор: Rickert 20.7.2007, 08:52
Lazin, он не пуст стопудово!
Цитата(Lazin @  20.7.2007,  08:42 Найти цитируемый пост)
Потому что тело цикла исполняется только в том случае, если it != terms.end()

Нет, он выполняется до тех пор пока данное условие - true
У меня ошибка в другом видать была.
Смотри:
Код

У меня есть цикл в котором:
uTerminal* tff;

while(...)
{
  ...
  term.push_back(uTerminal());
  tff = &term.back();
}

term.push_back(uTerminal()) отрабатывает два раза, а при третьей итерации цикла - выдаёт:
Цитата
*** glibc detected *** double free or corruption (fasttop): 0x09abc350 ***

Автор: Lazin 20.7.2007, 09:18
Дело не в том - пуст или нет,
Код

int a = -1; 
for (int i = 0; i !=10; ++i)
{
    a = i;
}
cout << a << endl;

выдаст 9 а не 10. 
А зачем tff = &term.back(); в каждой итерации выполнять? Все итераторы - указатели на элементы вектора могут стать не действительными после добавления нового элемента в контейнер, может в этом дело?

Автор: Rickert 23.7.2007, 06:52
Ладно, короче. Лишний раз убедился, что лучше за 2 минуты напишу свой класс списка, чем буду колупаться с этим stl smile
Всё равно, спасибо!

Автор: Daevaorn 23.7.2007, 08:57
Цитата(Rickert @  23.7.2007,  07:52 Найти цитируемый пост)
Ладно, короче. Лишний раз убедился, что лучше за 2 минуты напишу свой класс списка, чем буду колупаться с этим stl smile
Всё равно, спасибо! 

удачи и успехов в этом не легком труде - написаниии велосипедов. Разобраться в конструкциях языка и спецификации стандартной библиотки, понятно дело, лень. Бывает.
А Lazin всё по делу говорил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)