【发布时间】:2016-09-17 16:29:50
【问题描述】:
我是 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_中删除边缘,这是通过共享指针管理的?
【问题讨论】:
-
你应该检查 find 的返回,以防它不成功。除此之外,存储在您试图销毁的共享指针中的指针是否分配在堆上?它是如何分配的?
-
Edges 是多态的还是包含大量数据?如果不是,那为什么要使用共享指针呢?价值语义可以是一个巨大的胜利。 -
edges_中存储的边是共享指针。它通过 std::make_shared 从边转换为共享指针。 “new”不是用来制作指针指向的对象,所以我认为它没有分配在堆上。至于边,是的,它们是多态的,因为 Graph 的通用模板类与不同类型的函数模板一起使用,节点和边结构是该图类的一部分。
-
findOrig->second->edges_.insert(std::make_shared
(Edge (findOrig->second, findDest->second, val))); -
关于多态:
Edge是否包含虚成员函数?
标签: c++ graph iteration shared-ptr stdset