ссылка на вектор :: фронт работает, но вектор :: начало не - PullRequest
3 голосов
/ 09 июля 2010

У меня есть этот бит кода:

cerr << client->inventory.getMisc().front()->getName() << endl;
vector<itemPtr>::iterator it;
it = client->inventory.getMisc().begin();
cerr << (*it)->getName() << endl;

Позвольте мне объяснить это немного:

client - это tr1::shared_ptr, который указывает на объект, у которого есть член с именем inventory, у которого есть закрытый vector<itemPtr> член, доступный по getMisc(). itemPtr - это typedef для tr1::shared_ptr<Item>, а getName() возвращает приватный std::string член Item.

По сути, client->inventory.getMisc() сводится к std::vector, и я пытаюсь получить итератор для его первого элемента.

Проблема в том, что четвертая строка имеет ошибки. Очевидно, что итератор или shared_ptr, на который он указывает, недопустимы. Я использовал первый оператор cerr для проверки правильности самого вектора, и он печатает так, как должен, так что я думаю, что это так.

Есть что-то, что я делаю не так? В качестве альтернативы, что бы вы, ребята, сделали, чтобы отладить это?

Ответы [ 3 ]

12 голосов
/ 09 июля 2010

Что именно является подписью getMisc?

Если вы на самом деле возвращаете std::vector<itemPtr>, то вы возвращаете копию списка.В этом случае первый шаблон доступа будет работать (медленно), поскольку временная копия не будет уничтожена до тех пор, пока не завершится выполнение front, и к этому времени сам itemPtr будет скопирован во временную.Второй сбой, потому что после попадания на итератор с begin, временный объект выходит из области видимости и уничтожается, в результате чего только что созданный итератор зависает.

1 голос
/ 09 июля 2010

что бы вы, ребята, сделали, чтобы отладить это?

Пройдите через код, чтобы увидеть, что отличается от того, что front() возвращает и что (*it) возвращает.

0 голосов
/ 09 июля 2010

Вы уверены, что вектор не пустой? Возможно, что front и begin ведут себя немного по-разному, а front может работать по чистой случайности, в то время как дополнительные проверки в самом итераторе вызывают ошибку seg при его использовании.

...