可以创建 weak_ptr 来设置元素

Possible to create weak_ptr to set elements

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

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

有没有一种方法可以使用 weak_ptr 来指向集合中的对象,而无需在集合本身中使用 shared_ptrs?或者是实现此目的的唯一方法是使用一组 share_ptrs 而不是对象?

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

或许可以设计一个不依赖于 std::shared_ptr 的弱指针,但那不会是 std::weak_ptr。弱指针和容器必须在非常深的层次上合作——你也将替换 std::multiset

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

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

the erase members shall invalidate only iterators and references to the erased elements

如果你打算使用智能指针来管理一个指针,你应该使用智能指针来管理对该指针的所有访问,否则你仍然有同样的问题等着你。