3

我有这段代码:

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>,并getName()返回 的私有std::string成员Item

本质上,client->inventory.getMisc()归结为 a std::vector,我试图让迭代器指向它的第一个元素。

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

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

4

3 回答 3

12

究竟是什么签名getMisc

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

于 2010-07-09T17:36:25.797 回答
1

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

单步执行代码以查看返回的内容和返回的内容有何front()不同(*it)

于 2010-07-09T17:35:29.373 回答
0

你确定向量不为空吗?它的行为可能略有不同,并且front可能纯粹是偶然的,而迭代器本身的额外检查在使用时会导致段错误。beginfront

于 2010-07-09T17:37:38.270 回答