加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 引用vector :: front有效,但vector :: begin则没有

发布时间:2020-12-16 10:27:49 所属栏目:百科 来源:网络整理
导读:我有这段代码: cerr client-inventory.getMisc().front()-getName() endl;vectoritemPtr::iterator it;it = client-inventory.getMisc().begin();cerr (*it)-getName() endl; 让我解释一下: client是一个tr1 :: shared_ptr,它指向一个对象,该对象具有名为i
我有这段代码:

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的成员,该成员具有私有向量< itemPtr>成员可以通过getMisc()访问. itemPtr是tr1 :: shared_ptr< Item>的typedef,getName()返回Item的私有std :: string成员.

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

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

有什么我做错了吗?或者,你们会做什么来调试这个?

解决方法

究竟什么是getMisc的签名?

如果你实际上正在返回一个std :: vector< itemPtr>那么你将返回一份清单.在这种情况下,第一个访问模式将起作用(缓慢),因为临时副本在前端完成执行之前不会被销毁,此时itemPtr本身被复制到临时副本中.第二个失败是因为在使用begin获取迭代器后,临时属于范围并被销毁,而刚刚创建的迭代器会挂起.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读