用途
m02-resource 是一个关于 Rust 智能指针与资源管理的技能文档,核心目标是回答:某个资源需要什么样的所有权模式?它不把智能指针当作孤立的语法点,而是把它放在设计决策链条中:先判断所有权、线程上下文和循环引用,再决定使用哪种类型。
主要能力
文档围绕“语言机制”这一层展开,提供以下内容:
- 核心判断问题:所有权是单一还是共享;访问是单线程还是多线程;是否存在潜在循环。
- 错误到设计问题的对照,例如把“需要堆分配”直接对应“用 Box”之前,先问“为什么不能放在栈上”;把 Rc 内存泄漏直接对应“用 Weak”之前,先问“循环在设计中是否必要”;把 RefCell panic 直接对应“用 try_borrow”之前,先问“运行时检查是否是正确方案”;把 Arc 开销抱怨直接对应“接受它”之前,先问“多线程访问是否真的必要”。
- 决策流程:需要堆分配时,单一所有权用 Box,多线程共享用 Arc,单线程共享用 Rc;不需要堆分配则默认栈分配。存在引用循环时,一个方向使用 Weak;不存在循环时,普通 Rc/Arc 即可。需要内部可变性时,线程安全场景用 Mutex 或 RwLock,非线程安全场景若类型为 Copy 用 Cell,否则用 RefCell;不需要内部可变性则用 &mut T。
- 速查表:Box(单一所有权、线程安全、用于堆分配与递归类型)、Rc(共享所有权、非线程安全、用于单线程共享)、Arc(共享所有权、线程安全、用于多线程共享)、Weak(弱引用、与 Rc/Arc 相同线程安全属性、用于打破引用循环)、Cell(单一所有权、非线程安全、用于 Copy 类型的内部可变性)、RefCell(单一所有权、非线程安全、用于运行时检查的内部可变性)。
- 常见错误与修复:Rc 循环泄漏由互相强引用导致,修复方向是一个方向使用 Weak;RefCell panic 由运行时借用冲突导致,修复方向是 try_borrow 或重构;Arc 开销来自热点路径中的原子操作,单线程时可考虑 Rc;不必要的 Box 出现在数据可放入栈时,应移除 Box。
- 反模式提示:到处使用 Arc 会带来不必要的原子开销,单线程应用 Rc;到处使用 RefCell 会导致运行时 panic,应设计清晰的所有权;对小类型使用 Box 会产生不必要分配;忽略循环引用中的 Weak 会造成内存泄漏,父子结构应使用 Weak 设计。
- 向上追溯:当指针选择不清楚时,追溯到设计层,例如“该用 Arc 还是 Rc”应追问数据是否跨线程共享,并检查并发模型与性能约束。
- 向下追溯:从设计落到实现,例如“需要单所有者堆数据”对应 Box<T>,“需要共享不可变数据(单线程)”对应 Rc<T>,“需要共享不可变数据(多线程)”对应 Arc<T>,“需要打破引用循环”对应 Weak<T>,“需要共享可变数据”在单线程对应 Rc<RefCell<T>>,多线程对应 Arc<Mutex<T>> 或 Arc<RwLock<T>>。
使用方式
文档以技能条目形式存在,给出触发场景,例如 Box、Rc、Arc、Weak、RefCell、Cell、智能指针、堆分配、引用计数等。使用时通常是带着具体资源管理问题进入,先回答所有权与线程上下文问题,再按决策流程或速查表选择类型,最后查看常见错误与反模式进行校正。
适用场景
适用于 Rust 开发中需要选择智能指针、处理共享所有权、解决引用循环、引入内部可变性、评估 Arc 开销或排查 Rc 内存泄漏与 RefCell panic 的场景。也适用于在单线程与多线程之间做取舍时,重新审视是否真的需要多线程访问。
限制
该文档聚焦语言机制层面的资源管理与指针选择,不涉及具体业务代码。文档中未提供安装命令、代码示例运行方式、收费与价格信息、平台信息或实际效果数据,这些内容暂未提供。