news 2026/10/30 6:49:15

Rust智能指针Rc<T> 使用总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rust智能指针Rc<T> 使用总结

Rust 程序设计语言第 15.4 节《Rc<T>引用计数智能指针》的核心内容总结如下:

1. 为什么需要Rc<T>?

  • 多所有权场景:在 Rust 严格的所有权规则下,一个值通常只有一个所有者。但在某些数据结构(如图、树中多个分支共享子节点)中,单个值可能需要有多个所有者。
  • 编译时未知生命周期:当需要在堆上分配数据供程序的多个部分读取,且无法在编译时确定哪一部分会最后结束使用该数据时,普通的Box<T>或引用无法满足需求(会导致所有权被移动或生命周期标注过于复杂)。
  • 解决方案:Rc<T>是Reference Counted(引用计数)的缩写。它通过在底层维护一个指向堆上数据的引用计数,来跟踪当前有多少个所有者正在使用该数据。只要引用计数大于 0,数据就一直有效;当引用计数归零时,数据会被自动清理。

2. 使用限制

  • 仅限单线程:Rc<T>只能用于单线程场景。如果用于多线程,会导致引用计数不安全(它没有实现线程安全的Send和Sync)。多线程环境下的引用计数需要使用Arc<T>。
  • 只读共享:Rc<T>提供的只能是不可变引用(只读数据)。它不允许通过多个可变引用修改数据,以防止违反 Rust 的借用规则(避免数据竞争)。若需在共享的同时修改数据,通常需要配合RefCell<T>(内部可变性模式)。

3. 代码示例对比

  • Box<T>的局限:
    若尝试让两个链表b和c共享同一个子列表a(使用Box<T>),当b包含a时,a的所有权会被移动(move),导致无法再将其赋给c,从而引发编译错误。
  • 使用Rc<T>解决:
    将List定义中的Box<List>替换为Rc<List>。创建b和c时,通过克隆Rc指针来共享所有权:
usestd::rc::Rc;enumList{Cons(i32,Rc<List>),Nil,}fnmain(){leta=Rc::new(List::Cons(5,Rc::new(List::Cons(10,Rc::new(List::Nil)))));// 使用 Rc::clone(&a) 增加引用计数,而不是移动所有权letb=List::Cons(3,Rc::clone(&a));letc=List::Cons(4,Rc::clone(&a));}

4. 关键特性与惯用法

  • **Rc::clone(&a)vsa.clone()**:

  • 两者效果相同,但 Rust 的惯例是使用Rc::clone(&a)。

  • Rc::clone的实现不会对底层数据进行深拷贝(Deep Copy),它仅仅是将引用计数加 1,操作非常快。

  • 这种写法能在视觉上与“深拷贝式的 clone”区分开,方便在排查性能问题时迅速定位到耗时的深拷贝操作。

  • 检查引用计数 (Rc::strong_count):

  • 可以通过Rc::strong_count(&a)查看当前的强引用计数。

  • 当作用域结束或变量被丢弃时,Droptrait 会自动将引用计数减 1,无需手动调用减少计数的函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 6:49:09

AI不淘汰品牌,只淘汰拿不出证据的品牌——AI世代营销的两条信任链路

【摘要】2026年生成式AI问答入口流量占比突破52%&#xff0c;传统搜索引擎月人均使用次数同比下降18.8%&#xff0c;仅13%的营销组织完成智能代理体系部署。文章以“AI是信任过滤器”为核心轴&#xff0c;拆解人机双端信任链路的构建逻辑与失效边界&#xff0c;为品牌提供从流量…

作者头像 李华
网站建设 2026/10/30 6:47:46

这个 AI 这次升级,做的是减法

原文链接&#xff1a;https://mp.weixin.qq.com/s/_p0fyQTW6LTgNkV6v5_utw人类作者&#xff1a;月牙寂&#xff08;龚浩华&#xff09; Agent 作者&#xff1a;月绡凝&#xff08;小凝&#xff09; 免责声明&#xff1a;本文是我个人 AI 工程化实践的知识分享&#xff0c;仅供学…

作者头像 李华
网站建设 2026/10/30 6:47:10

在 SAP BTP ABAP Environment 的 RAP 应用中实现可审计的字段级 Change Log

一个企业级 RAP 应用做到可以新增、修改、删除业务数据,通常只是完成了业务功能的一半。系统真正投入使用之后,很快就会出现另一类问题。 某个字段原来是什么值,后来被改成了什么值。 是谁改的。 什么时候改的。 这次变化来自创建、修改还是删除操作。 如果业务对象涉及…

作者头像 李华
网站建设 2026/10/30 6:44:26

混沌拓扑学(HDT)恒星开放系统模型:空位填充原理、外来涡旋吸收与太阳寿命重估

摘要 标准恒星主序寿命模型建立于封闭系统假设之上&#xff0c;将恒星演化过程近似为核燃料能量的单向耗散过程&#xff0c;预设真空背景介质不参与恒星的能量动力学平衡。该模型长期用于恒星时标估算与演化标定&#xff0c;但其封闭边界条件为人工理论预设&#xff0c;并非宇宙…

作者头像 李华
网站建设 2026/10/30 6:42:30

Mysql/Sqlserver/Postgresql 数据库同步软件

要实现Mysql 、Sqlserver、Postgresql数据库之间的准实时同步&#xff0c;一般都是要依靠源数据库的日志去实现&#xff0c;日志里有增量变化&#xff0c;然后就可以获取到从而同步到目标端。Mysql有binlog日志&#xff0c;Sqlserver有CDC日志&#xff0c;Postgresql有Wal日志&…

作者头像 李华