2026/10/30 6:49:22

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

Rust智能指针Rc<T> 使用总结 Rust 程序设计语言第 15.4 节《RcT引用计数智能指针》的核心内容总结如下1. 为什么需要RcT多所有权场景在 Rust 严格的所有权规则下一个值通常只有一个所有者。但在某些数据结构如图、树中多个分支共享子节点中单个值可能需要有多个所有者。编译时未知生命周期当需要在堆上分配数据供程序的多个部分读取且无法在编译时确定哪一部分会最后结束使用该数据时普通的BoxT或引用无法满足需求会导致所有权被移动或生命周期标注过于复杂。解决方案RcT是Reference Counted引用计数的缩写。它通过在底层维护一个指向堆上数据的引用计数来跟踪当前有多少个所有者正在使用该数据。只要引用计数大于 0数据就一直有效当引用计数归零时数据会被自动清理。2. 使用限制仅限单线程RcT只能用于单线程场景。如果用于多线程会导致引用计数不安全它没有实现线程安全的Send和Sync。多线程环境下的引用计数需要使用ArcT。只读共享RcT提供的只能是不可变引用只读数据。它不允许通过多个可变引用修改数据以防止违反 Rust 的借用规则避免数据竞争。若需在共享的同时修改数据通常需要配合RefCellT内部可变性模式。3. 代码示例对比BoxT的局限若尝试让两个链表b和c共享同一个子列表a使用BoxT当b包含a时a的所有权会被移动move导致无法再将其赋给c从而引发编译错误。使用RcT解决将List定义中的BoxList替换为RcList。创建b和c时通过克隆Rc指针来共享所有权usestd::rc::Rc;enumList{Cons(i32,RcList),Nil,}fnmain(){letaRc::new(List::Cons(5,Rc::new(List::Cons(10,Rc::new(List::Nil)))));// 使用 Rc::clone(a) 增加引用计数而不是移动所有权letbList::Cons(3,Rc::clone(a));letcList::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无需手动调用减少计数的函数。