代码之家  ›  专栏  ›  技术社区  ›  sheridp

可以创建弱指针来设置元素

  •  -2
  • sheridp  · 技术社区  · 7 年前

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

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

    有没有一种方法可以使用弱指针指向集合中的对象而不在集合本身中使用共享指针?或者,实现这一点的唯一方法是拥有一组共享指针而不是对象?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ben Voigt    7 年前

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

    可能设计一个不依赖的弱指针 STD::SaldypPTR 但是那不是 STD:: .弱指针和容器必须在一个非常深的层次上进行合作——您将要替换 std::multiset 也是。

    不过,我相信你可能有更大的问题…如果您要从 STD::多集 ,这可能会使指向所有元素的指针失效,而不仅仅是删除的元素。存储 STD::SaldypPTR 在你的环境中,可以同时解决这两个问题。

    实际上,删除部分不适用于关联容器,包括 STD::多集 . 其他容器类型将不安全。但多重集保证

    这个 erase 成员只应使迭代器和对已删除元素的引用失效。

        2
  •  0
  •   Richard    7 年前

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