可以创建weak_ptr来设置元素

时间:2019-01-14 22:06:32

标签: c++ set weak-ptr

我有一个std :: multiset对象(使用set :: emplace在适当位置创建)。这使我可以使用自定义比较器进行排序访问。

对象本身还包含指向其他对象的指针列表,这些对象标识一些依赖项(这些依赖项未在比较器中使用,并且不影响集合的基础树结构)。当前,此依赖项列表被实现为原始对象指针的std :: list。但是,这是不安全的,因为可以从多集中删除依赖项,而不必通知持有这些依赖项指针的对象。

有没有一种方法可以使用weak_ptr指向集合中的对象,而无需在集合本身中使用shared_ptrs?还是唯一的方法是拥有一组share_ptrs而不是Objects?

2 个答案:

答案 0 :(得分:2)

std::weak_ptr实际上指向std::shared_ptr用来跟踪对象位置和生存期的元数据块。如果没有shared_ptr,则没有元数据块。

可能有可能设计一个不依赖std::shared_ptr的弱指针,但不会依赖std::weak_ptr。弱指针和容器将必须在很深的层次上合作-您也将替换std::multiset

我相信您可能会遇到更大的问题,但是...如果您要从std::multiset中删除内容,则可能会使指向所有元素的指针无效,而不仅仅是删除的那些元素。将std::shared_ptr存储在您的集合中将立即解决这两个问题。

实际上,删除的部分不适用于关联容器,包括std::multiset。其他容器类型将不安全。但是,Multiset可以保证

  

erase成员应仅使迭代器和对已删除元素的引用无效

答案 1 :(得分:1)

如果要使用智能指针来管理指针,则应该使用智能指针来管理对该指针的所有访问,否则,您仍然有同样的问题在等待您。