共享指针如何工作?

2023-12-26

共享指针如何知道有多少指针指向该对象? (在本例中为shared_ptr)


基本上,shared_ptr有两个指针:一个指向共享对象的指针和一个指向包含两个引用计数的结构体的指针:一个用于“强引用”,即具有所有权的引用,另一个用于“弱引用”,即不具有所有权的引用。

当您复制一个shared_ptr,复制构造函数会增加强引用计数。当你摧毁一个shared_ptr,析构函数递减强引用计数并测试引用计数是否为零;如果是,析构函数将删除共享对象,因为没有shared_ptr不再指着它了。

弱引用计数用于支持weak_ptr;基本上,任何时候weak_ptr是从创建的shared_ptr,弱引用计数会递增,并且每当一个被破坏时,弱引用计数就会递减。只要强引用计数或弱引用计数大于零,引用计数结构就不会被破坏。

实际上,只要强引用计数大于零,共享对象就不会被删除。只要强引用计数或弱引用计数不为零,引用计数结构体就不会被删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

共享指针如何工作? 的相关文章

随机推荐

  • 如何在不同模块中隐藏 Java 中 Kotlin 内部类的可见性?

    我正在研究用 Kotlin 开发的 Android 库 我将某些类的访问修饰符保留为internal 内部类仅在 Kotlin 的该库模块中可见 如果我在应用程序中实现该库 那么它根本不可见 但从 Java 代码访问该库时就会出现问题 如果
  • 如何找出 Vim 设置在哪个插件中被更改?

    今天我有一些奇怪的行为 我有 set autoindent 在我的 vimrc 中 但由于某种原因 每当我打开 PHP 文件时 它就会被关闭 我现在通过添加一行来修复它 autocmd FileType php set autoindent
  • 结合字母顺序和自然顺序(又名用户理智排序)

    我认为这很容易找到预制的 但似乎我在网上找到的任何解决方案都只能解决部分问题 我想对列表进行排序文件名 这些文件大多以人名和 或地址命名 由用户提供 有时使用不同的语言 主要是德语 到处混有一点法语和意大利语 很少有其他西方语言 这个想法是
  • Android Eclipse 插件太慢

    我目前使用的是带有 1 83GHz 处理器和 1 GB RAM 的 Windows 7 机器 我曾经能够使用所有应用程序 没有速度问题 我最近在 Eclipse Helios 中安装了 Android 插件 现在 Eclipse 速度严重减
  • 循环内的侦听器不允许更改外部布尔标志

    继我之前的帖子之后here https stackoverflow com questions 15762311 add a keylistener inside a loop is it possible 我写了一个监听器 Overrid
  • 在 HTML5 和 JavaScript 中使用 Google 地图室内地图 API

    我想使用 HTML5 和 JavaScript 创建一个室内地图应用程序 我创建了一个简单的路线图应用程序 但是当我单击放大任何室内兼容的建筑物 购物中心时 没有级别或地板选项 那么 HTML5 和 Javascript 支持室内功能吗 在
  • 使用 itextsharp 的文本的 x 和 y 坐标

    当我使用 itextsharp 提取文本时 我将获得文本的 x 和 y 坐标 如果我根据 x y 位置将文本从 pdf 转换为 html 则通过使用这 2 个坐标来更改文本位置 获取我使用的 x y 坐标 矢量 curBaseline re
  • 我的班级实例中出现奇怪的内存覆盖问题

    这个问题与this https stackoverflow com questions 6649567 how to check if network shared exe file is used by more than one use
  • 具有 null 安全性的 Flutter / Dart 包integration_test

    据我了解 包集成 测试 https pub dev packages integration test包不是空类型安全的 该包可以用于当前的 Flutter 版本 版本 gt 2 0 吗 如果没有 还有其他选择吗 正如自述文件中所述 该包是
  • SAS LOOP - 从具有值的记录创建列

    假设我有随机诊断代码 例如 001 v58 142 如何从记录中的代码构造列 Input id found code 1 1 001 2 0 v58 3 1 v58 4 1 003 5 0 v58 15000 0 v58 Output id
  • Twilio 在打电话时说动词

    基于这个问题 https stackoverflow com questions 6863305 twilio say verb nested into a dial verb 它非常接近我想要的 当双方建立连接时 我们尝试在通话期间触发
  • 从 Apache Velocity 模板访问常量值?

    是否可以从 Velocity 模板访问常量值 即 Java 类中定义的公共静态最终变量 我希望能够写出这样的东西 if a lt Long MAX VALUE 但这显然不是正确的语法 有很多种方法 1 您可以将值直接放入上下文中 2 您可以
  • 如何优化 MySQL 更新查询?

    我有一个包含 300 000 条记录的表 在此表中有重复的行 我想更新列 flag TABLE number flag more column ABCD 0 ABCD 0 ABCD 0 BCDE 0 BCDE 0 我使用此查询
  • 限制 Django 模型中的递归外键深度

    我有一个 Django 模型 其中 self 的外键可为空 我有兴趣对递归深度引入硬限制 例如 10 哪里是检查这个的正确位置以及我应该在那里抛出什么样的异常 我的意思的伪示例 def limit recursion depth self
  • Apache mod_rewrite 未将表达式映射到参数

    我有一个网站使用apache mod rewrite并且在过去 6 个月里一直工作 没有出现任何错误 我有以下重写规则 RewriteRule products a z products php category 1 NC L 这是我页面中
  • WooCommerce:将自定义 Metabox 添加到管理订单页面

    我目前已成功向我的 WooCommerce 产品页面添加一个字段 该字段显示值 在购物车 前端 中 在结账页面 前端 在订单页面 前端 并在管理个人订单页面 后端 中 问题 它没有在管理订单 自定义字段 Metabox 中显示为自定义字段及
  • 如何在无限行模型中设置初始起始页?

    我使用的是带有无限行模型和分页功能的 Ag Grid 版本 20 0 0 我希望能够设置第一次加载的初始页面 但我没有看到任何允许我自定义它的属性 他们只提供方法paginationGoToPage更改页面 但此方法要求首先加载网格 这迫使
  • 如何在sql server management studio 2012中创建复合外键

    我可以通过选择两列 OrderId CompanyId 并右键单击并设置为主键 在 sql server management studio 2012 中成功创建复合主键 但我不知道如何使用 sql server management st
  • Firebase 测试实验室对 Appium 的支持

    有谁知道 Firebase 测试实验室是否支持 Appium 测试框架 至少在路线图中吗 由于 Firebase 由 Google 提供支持 因此您很难指望它会优先支持开源社区驱动的框架 而 Appium 正是如此 目前 Firebase
  • 共享指针如何工作?

    共享指针如何知道有多少指针指向该对象 在本例中为shared ptr 基本上 shared ptr有两个指针 一个指向共享对象的指针和一个指向包含两个引用计数的结构体的指针 一个用于 强引用 即具有所有权的引用 另一个用于 弱引用 即不具有