我是std::shared_ptr和std::set的新手。对于下面的代码,我想知道如何从edges_中删除边缘。
edges_声明为std::set<std::shared_ptr<Edge>> edges_;,我希望删除存储在std::set中的共享指针引用的边缘。我的代码在这里,但似乎有问题。
auto findEdge = findLinkingNode1->second->edges_.find(edge);
findLinkingNode1->second->edges_.erase(findEdge);错误:
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_中删除边缘,它是通过共享指针管理的?
发布于 2016-09-17 17:09:59
只是猜测,但考虑到你提供的代码..。
auto findEdge = findLinkingNode1->second->edges_.find(edge);
findLinkingNode1->second->edges_.erase(findEdge);..。我想说,您的问题是删除了edges_.end() 这是不允许的 (可能是未定义的行为):
迭代器
pos必须是有效的和可取消引用的。因此,end()迭代器(它是有效的,但不是不可取消的)不能用作pos的值。
如果在集合中找不到给定的findEdge,变量edge将等于edge。为了找到一个元素,std::set使用一个Compare对象,该对象的类型是通过第二个模板参数定义的.
std::set<std::shared_ptr<Edge>> edges_;..。因此,它默认为std::less<std::shared_ptr<Edge>>,这反过来又称为共享指针的,后者.
请注意,shared_ptr的比较运算符只是比较指针值;所指向的实际对象并不是比较的。
..。不比较对象,而只比较指针。因此,如果用于插入和搜索的指针没有指向完全相同的(例如,在相同的,而不仅仅是“相等”)对象中,那么您已经注册了麻烦。
以上只是猜测,但考虑到你的评论.
findOrig->second->edges_.insert(std::make_shared<Edge>(Edge (findOrig->second, findDest->second, val) ));..。这是一个事实,因为(几乎)没有办法获得make_shared返回的指针。
解决方案:为您的集合实现一个比较类,比较实际的Edge对象。(去掉指针并不那么简单,因为您说过Edge是多态的)
士气:始终测试可能出现的错误情况。
https://stackoverflow.com/questions/39549129
复制相似问题