我有一个std :: multiset对象(使用set :: emplace在适当位置创建)。这使我可以使用自定义比较器进行排序访问。
对象本身还包含指向其他对象的指针列表,这些对象标识一些依赖项(这些依赖项未在比较器中使用,并且不影响集合的基础树结构)。当前,此依赖项列表被实现为原始对象指针的std :: list。但是,这是不安全的,因为可以从多集中删除依赖项,而不必通知持有这些依赖项指针的对象。
有没有一种方法可以使用weak_ptr指向集合中的对象,而无需在集合本身中使用shared_ptrs?还是唯一的方法是拥有一组share_ptrs而不是Objects?
答案 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)
如果要使用智能指针来管理指针,则应该使用智能指针来管理对该指针的所有访问,否则,您仍然有同样的问题在等待您。