c++ - weak_ptr 持有哪些变量?
问题描述
我了解哪些方法可用以及它们是什么。请描述weak_ptr 类的私有部分或给出一些自定义weak_ptr 代码的示例。我无法理解 std::weak_ptr 实现。
解决方案
非侵入式共享指针实现通常包含指向某个动态分配的“状态”的指针,它计算对原始对象的引用数。
当共享指针被复制时,该副本获得指向相同“状态”的相同指针,并且“状态”内的计数递增以指示现在有两个共享指针共享资源。
当共享指针被销毁时,它会递减计数器以指示现在共享资源的指针减少了。如果这导致计数器读数为零,则资源被破坏。
弱指针也有一个指向这个“状态”的指针,但它不会增加或减少计数器。当被询问时,它将使用相同的状态构造一个共享指针,但前提是计数不为零。如果计数为零,则最后一个共享指针已经破坏了资源,我们无法再访问它。
有趣的是,您还需要这样的逻辑来控制“状态”对象的生命周期。:) (我想这是使用第二个计数器实现的,它都会增加shared_ptr
,weak_ptr
但不要引用我的话。)
(your data) (ref. counters)
║ ║
[resource] [state]
┆ │ │ │ │ │
┆ │ └─[shared_ptr]───┘ │ │
┆ └───[shared_ptr]─────┘ │
└┄┄┄┄┄┄┄[weak_ptr]────────┘
当然,任何特定std::weak_ptr
实现的私有部分究竟是什么样子取决于编写它的人。
shared_ptr
顺便说一句,如果您怀疑它指向的资源可能已经由其他地方的 (s) 管理,那么该图表显示了为什么您不应该从原始指针构造 a shared_ptr
:您将获得第二个不相关的“状态”对象,您的计数器将是错误的,并且您的资源可能会过早地被破坏(如果存在这样的概念,肯定会被破坏两次),造成混乱。
推荐阅读
- .htaccess - 向除单个模式外的所有 URL 添加尾部斜杠
- mysql - Sequelize 模型中的自动填充字段?
- sql - 按条款推进 ODBC 组
- git - .gitignore 文件当 2 个 git repo 在同一目录中时
- sas - 将一行中的一些列移动到新行中
- python - “清理”我的 Python 环境是否明智?
- java - 调用容器“xxxxxx”时出错:在 Redhat Business Central 上解组输入时出错
- quarkus - Quarkus 休眠验证异常未显示在控制台上
- android - 在设置菜单项的可见性时如何解决这个空指针异常?
- python - 在 Tkinter 中切换窗口时,Python-Listbox 项目不会终止