引用vector :: front有效,但vector :: begin却没有

时间:2010-07-09 17:31:03

标签: c++ stdvector segmentation-fault

我有这段代码:

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()成员。 itemPtrtr1::shared_ptr<Item>的typedef,getName()返回std::string的私人Item成员。

基本上,client->inventory.getMisc()归结为std::vector,我正试图获得第一个元素的迭代器。

问题是第四行是segfaults。显然,迭代器或它指向的shared_ptr都是无效的。我使用第一个cerr语句来测试向量本身是否有效,并且它应该打印,所以我认为它是。

我有什么问题吗?或者,你们会做什么来调试它?

3 个答案:

答案 0 :(得分:12)

究竟是getMisc的签名是什么?

如果您实际上正在返回std::vector<itemPtr>,那么您将返回列表的副本。在这种情况下,第一个访问模式将起作用(缓慢),因为临时副本在front完成执行之后才会被销毁,此时itemPtr本身将被复制到临时副本中。第二个失败是因为在使用begin获取迭代器之后,临时值超出范围并被销毁,使刚刚创建的迭代器挂起。

答案 1 :(得分:1)

  

你们会做什么来调试这个?

逐步查看代码,了解front()返回的内容与(*it)返回的内容有何不同。

答案 2 :(得分:0)

你确定矢量不是空的吗? frontbegin的行为可能略有不同,而front可能只是纯粹的机会,而迭代器本身的额外检查会在使用时导致seg错误。