首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从edges_中删除被声明为std::set<std::shared_ptr<Edge>> edges_的边缘;

从edges_中删除被声明为std::set<std::shared_ptr<Edge>> edges_的边缘;
EN

Stack Overflow用户
提问于 2016-09-17 16:29:50
回答 1查看 42关注 0票数 0

我是std::shared_ptr和std::set的新手。对于下面的代码,我想知道如何从edges_中删除边缘。

edges_声明为std::set<std::shared_ptr<Edge>> edges_;,我希望删除存储在std::set中的共享指针引用的边缘。我的代码在这里,但似乎有问题。

代码语言:javascript
复制
auto findEdge = findLinkingNode1->second->edges_.find(edge);
findLinkingNode1->second->edges_.erase(findEdge);

错误:

代码语言:javascript
复制
test8c(3034,0x7fff78df2000) malloc: *** error for object 0x7f8553403350: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

考虑到共享指针存储在std::set中,我如何从edges_中删除边缘,它是通过共享指针管理的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-17 17:09:59

只是猜测,但考虑到你提供的代码..。

代码语言:javascript
复制
auto findEdge = findLinkingNode1->second->edges_.find(edge);
findLinkingNode1->second->edges_.erase(findEdge);

..。我想说,您的问题是删除了edges_.end() 这是不允许的 (可能是未定义的行为):

迭代器pos必须是有效的和可取消引用的。因此,end()迭代器(它是有效的,但不是不可取消的)不能用作pos的值。

如果在集合中找不到给定的findEdge,变量edge将等于edge。为了找到一个元素,std::set使用一个Compare对象,该对象的类型是通过第二个模板参数定义的.

代码语言:javascript
复制
std::set<std::shared_ptr<Edge>> edges_;

..。因此,它默认为std::less<std::shared_ptr<Edge>>,这反过来又称为共享指针的,后者.

请注意,shared_ptr的比较运算符只是比较指针值;所指向的实际对象并不是比较的。

..。不比较对象,而只比较指针。因此,如果用于插入和搜索的指针没有指向完全相同的(例如,在相同的,而不仅仅是“相等”)对象中,那么您已经注册了麻烦。

以上只是猜测,但考虑到你的评论.

代码语言:javascript
复制
findOrig->second->edges_.insert(std::make_shared<Edge>(Edge (findOrig->second, findDest->second, val) ));

..。这是一个事实,因为(几乎)没有办法获得make_shared返回的指针。

解决方案:为您的集合实现一个比较类,比较实际的Edge对象。(去掉指针并不那么简单,因为您说过Edge是多态的)

士气:始终测试可能出现的错误情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39549129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档