当前位置: 首页 > news >正文

unique_ptr和shared_ptr的引用计数机制有何不同?

好的,我们来详细解释一下 unique_ptrshared_ptr 在引用计数机制上的不同:

核心区别

  1. unique_ptr (唯一指针)

    • 没有引用计数机制。这是它的核心特征。
    • 它代表了对所管理资源的独占所有权。这意味着在任何时刻,只有一个 unique_ptr 实例可以指向该资源。
    • 为了维护这种独占性,unique_ptr 禁止复制构造和复制赋值操作。如果你尝试将一个 unique_ptr 赋值给另一个或者用它初始化一个新的 unique_ptr,编译器会报错。
    • 所有权可以通过 std::move 移动语义进行转移。移动操作会将所有权从一个 unique_ptr 转移到另一个 unique_ptr,原始的 unique_ptr 会变为 nullptr,不再拥有资源。移动操作不会涉及任何计数。
    • 生命周期结束时释放资源:当拥有资源的 unique_ptr 离开其作用域(被销毁)时,它所管理的资源会被立即释放(通过其关联的删除器)。
    • 特点总结:轻量、高效、无额外开销、强制明确的资源所有权转移。
  2. shared_ptr (共享指针)

    • 有引用计数机制。这是它实现共享所有权的核心。
    • 它代表了对所管理资源的共享所有权。这意味着可以有多个 shared_ptr 实例指向同一个资源。
    • 引用计数原理
      • 当一个 shared_ptr 被创建(例如通过构造函数或 make_shared)并指向一个新资源时,会创建一个控制块(通常动态分配),其中包含一个引用计数器(初始值为 1)。
      • 复制构造:当用一个 shared_ptr 初始化另一个新的 shared_ptr(即复制)时,它们指向同一个资源,并且引用计数器会递增 1
      • 赋值操作:当将一个 shared_ptr 赋值给另一个 shared_ptr 时,被赋值的那个 shared_ptr 会先递减它原来指向资源的引用计数(如果原来有资源),然后指向新的资源,并递增新资源的引用计数。
      • 析构/离开作用域:当一个 shared_ptr 被销毁(例如离开作用域)时,它会递减它所指向资源的引用计数。
      • 释放资源:只有当引用计数递减到 0 时,才意味着没有任何 shared_ptr 拥有该资源了。此时,控制块会负责调用关联的删除器来释放资源本身,并最终释放控制块的内存。
    • 特点总结:允许多个所有者、资源在所有共享指针都销毁后才释放、有额外的内存和性能开销(控制块和原子计数操作)、可能引入循环引用问题(需要配合 weak_ptr 解决)。

总结对比表

特性unique_ptrshared_ptr
所有权模型独占所有权 (Exclusive Ownership)共享所有权 (Shared Ownership)
引用计数
复制语义禁止复制允许复制 (递增引用计数)
移动语义允许移动 (转移所有权)允许移动 (转移所有权)
资源释放时机唯一所有者销毁时立即释放最后一个所有者销毁时释放
开销极小 (接近原始指针)较大 (控制块、原子计数操作)
主要用途明确单一所有者的资源需要多个所有者共享的资源

简单来说:unique_ptr 是“我的,只能是我的”,所以不需要计数;shared_ptr 是“大家的,谁最后走谁关灯”,所以需要计数来知道谁是最后一个。

http://www.dtcms.com/a/598968.html

相关文章:

  • 用c# 制作一个扑克牌小游戏
  • 买了域名如何做网站南昌有哪些做网站的公司
  • 京东商品详情接口深度解析:从反爬绕过到数据结构化重构
  • 微网站制作电话做的网站被注销
  • @Transactional失效的几种情况
  • 一般什么行业做网站的多袜子技术支持深圳网站建设
  • 网站策划书撰写流程河北seo推广系统
  • Java 全栈 Devs【应用】:[特殊字符] Java 异常处理最佳实践
  • 在线一键建站系统禹城做网站
  • Yolo中的检测头
  • 张家界建设局网站电话号码模板建站费用
  • 走进Linux的世界:进程状态
  • 毕设做网站需要买域名么网站建设方案之目标
  • 交叉熵损失函数(Cross-Entropy Loss)个人理解
  • 结对编程:提升编程效率与团队协作的最佳实践 | 如何通过结对编程实现高效协作和代码质量提升
  • 缓存优化(SpringCache、XXL-JOB)
  • 网站建设长期待摊费用个人网站的留言板怎么做
  • 优惠劵网站怎么做srm系统
  • Hugging Face Gated 模型下载全攻略:解决 401/403 和访问受限问题
  • 建筑行业网站模板ajax实现wordpress导航栏
  • 网站建设服务 杭州甜品店网页模板html
  • 状态机的实现方法--C语言版本
  • 网站做app开发有梦商城公司网站
  • 网站开发系统毕业综合实践报告电子版个人简历模板
  • 线代强化NO5|矩阵的运算法则|分块矩阵|逆矩阵|伴随矩阵|初等矩阵
  • 最新域名网站查询网站背景大小
  • 服装网站建设发展状况wordpress数据库访问慢
  • 大同市住房城乡建设网站扬州网站建设 天维
  • nat123做网站 查封编写网站的软件
  • 天津房地产网站建设福建联美建设集团有限公司网站