我有这段代码:
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
是tr1::shared_ptr<Item>
的typedef,getName()
返回std::string
的私人Item
成员。
基本上,client->inventory.getMisc()
归结为std::vector
,我正试图获得第一个元素的迭代器。
我有什么问题吗?或者,你们会做什么来调试它?
答案 0 :(得分:12)
究竟是getMisc
的签名是什么?
如果您实际上正在返回std::vector<itemPtr>
,那么您将返回列表的副本。在这种情况下,第一个访问模式将起作用(缓慢),因为临时副本在front
完成执行之后才会被销毁,此时itemPtr
本身将被复制到临时副本中。第二个失败是因为在使用begin
获取迭代器之后,临时值超出范围并被销毁,使刚刚创建的迭代器挂起。
答案 1 :(得分:1)
你们会做什么来调试这个?
逐步查看代码,了解front()
返回的内容与(*it)
返回的内容有何不同。
答案 2 :(得分:0)
你确定矢量不是空的吗? front
和begin
的行为可能略有不同,而front
可能只是纯粹的机会,而迭代器本身的额外检查会在使用时导致seg错误。