c++ - 可以创建 weak_ptr 来设置元素
问题描述
我有一个 std::multiset 对象(使用 set::emplace 创建)。这使我可以使用自定义比较器进行排序访问。
对象本身还包含指向其他对象的指针列表,这些对象标识了一些依赖项(这些依赖项不在比较器中使用,也不影响集合的底层树结构)。目前这个依赖列表被实现为一个 std::list 的原始对象指针。然而,这是不安全的,因为可以从多重集中删除依赖项,而不会通知持有这些依赖项指针的对象。
有没有办法使用weak_ptr 指向集合中的对象而不使用集合本身中的shared_ptrs?或者是实现这一点的唯一方法是拥有一组 share_ptrs 而不是 Objects?
解决方案
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
成员应仅使迭代器和对已擦除元素的引用无效
推荐阅读
- c# - 在 `GridView` 中出现错误“此行已属于此表”
- javascript - 将数据从子输入元素传递给vue中的父元素
- jenkins - 如何覆盖詹金斯脚本管道中的节点
- javascript - 我的 js 文件不断重复我之前的列表项。例如,如果我在表单上添加文本,则上一个列表项会与新列表项一起重复
- html - 为什么我的两个无序列表不能内联显示?
- php - Laminas API 工具中带有参数的自定义验证器
- reactjs - 如何使用 react-hook-forms 制作动态 watch()/usewatch()
- powershell - Powershell上的打印机名称+服务器名称
- amazon-web-services - AWS CDK - 如何在本地运行 API 和 Lambda?
- java - ProcessBuilder.start() 何时返回 null 而不是 Process 对象?