M02 Resource

作者 actionbook5c40d3ad7851无许可证1.5K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库6周前更新

CRITICAL: Use for smart pointers and resource management. Triggers: Box, Rc, Arc, Weak, RefCell, Cell, smart pointer, heap allocation, reference counting, RAII, Drop, should I use Box or Rc, when to use Arc vs Rc, 智能指针, 引用计数, 堆分配

AI 生成的概览

指导 Rust 开发者选择智能指针与所有权模式,如 Box、Rc、Arc、Weak、Cell 和 RefCell。

功能
该技能是 Rust 资源管理的决策指南。它梳理所有权模型、线程上下文和引用循环,再把具体情形对应到 Box、Rc、Arc、Weak、Cell、RefCell 等类型。它还列出常见错误、反模式,以及在指针选择不明确时可参考的相关主题。
适用场景
当需要在智能指针之间做选择时使用,例如 Box 与 Rc、Arc 与 Rc 的取舍,或排查 Rc 内存泄漏、RefCell panic、Arc 开销过大等问题。它也适合用于思考堆分配、引用计数、RAII 或 Drop 行为。
运行要求
无需任何工具、软件包或凭据;该技能仅包含说明,不含脚本。

Resource Management

Layer 1: Language Mechanics

Core Question

What ownership pattern does this resource need?

Before choosing a smart pointer, understand:

  • Is ownership single or shared?
  • Is access single-threaded or multi-threaded?
  • Are there potential cycles?

Error → Design Question

ErrorDon't Just SayAsk Instead
"Need heap allocation""Use Box"Why can't this be on stack?
Rc memory leak"Use Weak"Is the cycle necessary in design?
RefCell panic"Use try_borrow"Is runtime check the right approach?
Arc overhead complaint"Accept it"Is multi-thread access actually needed?

Thinking Prompt

Before choosing a smart pointer:

  1. What's the ownership model?

    • Single owner → Box or owned value
    • Shared ownership → Rc/Arc
    • Weak reference → Weak
  2. What's the thread context?

    • Single-thread → Rc, Cell, RefCell
    • Multi-thread → Arc, Mutex, RwLock
  3. Are there cycles?

    • Yes → One direction must be Weak
    • No → Regular Rc/Arc is fine

Trace Up ↑

When pointer choice is unclear, trace to design:

"Should I use Arc or Rc?"    ↑ Ask: Is this data shared across threads?    ↑ Check: m07-concurrency (thread model)    ↑ Check: domain-* (performance constraints)
SituationTrace ToQuestion
Rc vs Arc confusionm07-concurrencyWhat's the concurrency model?
RefCell panicsm03-mutabilityIs interior mutability right here?
Memory leaksm12-lifecycleWhere should cleanup happen?

Trace Down ↓

From design to implementation:

"Need single-owner heap data"    ↓ Use: Box<T>
"Need shared immutable data (single-thread)"    ↓ Use: Rc<T>
"Need shared immutable data (multi-thread)"    ↓ Use: Arc<T>
"Need to break reference cycle"    ↓ Use: Weak<T>
"Need shared mutable data"    ↓ Single-thread: Rc<RefCell<T>>    ↓ Multi-thread: Arc<Mutex<T>> or Arc<RwLock<T>>

Quick Reference

TypeOwnershipThread-SafeUse When
Box<T>SingleYesHeap allocation, recursive types
Rc<T>SharedNoSingle-thread shared ownership
Arc<T>SharedYesMulti-thread shared ownership
Weak<T>Weak refSame as Rc/ArcBreak reference cycles
Cell<T>SingleNoInterior mutability (Copy types)
RefCell<T>SingleNoInterior mutability (runtime check)

Decision Flowchart

Need heap allocation?├─ Yes → Single owner?│        ├─ Yes → Box<T>│        └─ No → Multi-thread?│                ├─ Yes → Arc<T>│                └─ No → Rc<T>└─ No → Stack allocation (default)
Have reference cycles?├─ Yes → Use Weak for one direction└─ No → Regular Rc/Arc
Need interior mutability?├─ Yes → Thread-safe needed?│        ├─ Yes → Mutex<T> or RwLock<T>│        └─ No → T: Copy? → Cell<T> : RefCell<T>└─ No → Use &mut T

Common Errors

ProblemCauseFix
Rc cycle leakMutual strong refsUse Weak for one direction
RefCell panicBorrow conflict at runtimeUse try_borrow or restructure
Arc overheadAtomic ops in hot pathConsider Rc if single-threaded
Box unnecessaryData fits on stackRemove Box

Anti-Patterns

Anti-PatternWhy BadBetter
Arc everywhereUnnecessary atomic overheadUse Rc for single-thread
RefCell everywhereRuntime panicsDesign clear ownership
Box for small typesUnnecessary allocationStack allocation
Ignore Weak for cyclesMemory leaksDesign parent-child with Weak

Related Skills

WhenSee
Ownership errorsm01-ownership
Interior mutability detailsm03-mutability
Multi-thread contextm07-concurrency
Resource lifecyclem12-lifecycle

来源与署名

来源:actionbook/rust-skills位于skills/m02-resource提交5c40d3a

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架