首页 > 解决方案 > 可以创建 weak_ptr 来设置元素

问题描述

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

对象本身还包含指向其他对象的指针列表,这些对象标识了一些依赖项(这些依赖项不在比较器中使用,也不影响集合的底层树结构)。目前这个依赖列表被实现为一个 std::list 的原始对象指针。然而,这是不安全的,因为可以从多重集中删除依赖项,而不会通知持有这些依赖项指针的对象。

有没有办法使用weak_ptr 指向集合中的对象而不使用集合本身中的shared_ptrs?或者是实现这一点的唯一方法是拥有一组 share_ptrs 而不是 Objects?

标签: c++setweak-ptr

解决方案


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成员应仅使迭代器和对已擦除元素的引用无效


推荐阅读