PluginBench
Skill
Pass
Audit score 90

m02-resource

actionbook/rust-skills

Master Rust smart pointers and resource management for correct ownership patterns.

What is m02-resource?

This skill teaches when and how to use Box, Rc, Arc, Weak, Cell, and RefCell for heap allocation and shared ownership. Use it when you encounter ownership errors, need to choose between smart pointer types, or are designing resource lifecycles in single-threaded or multi-threaded contexts.

  • Determine whether data needs single or shared ownership
  • Choose the right smart pointer (Box, Rc, Arc, Weak) for your ownership model
  • Identify and break reference cycles using Weak references
  • Decide between interior mutability options (Cell vs RefCell) for runtime vs compile-time checks
  • Trace ownership questions up to concurrency/design or down to implementation

How to install m02-resource

npx skills add https://github.com/actionbook/rust-skills --skill m02-resource
Claude Code
Cursor
Windsurf
Cline

How to use m02-resource

  1. 1.Identify your ownership need: single owner, shared immutable, or shared mutable
  2. 2.Check thread context: single-threaded or multi-threaded
  3. 3.Use the decision flowchart to select Box, Rc, Arc, or Weak
  4. 4.For shared mutable data, pair with Cell/RefCell (single-thread) or Mutex/RwLock (multi-thread)
  5. 5.If you have cycles, use Weak for one direction of the reference

Use cases

Good for
  • Deciding between Rc and Arc based on thread context
  • Fixing RefCell panics by restructuring ownership or using try_borrow
  • Breaking circular reference leaks in parent-child data structures
  • Choosing Box for recursive types or single-owner heap allocation
  • Selecting Cell vs RefCell for interior mutability needs
Who it's for
  • Rust developers learning ownership patterns
  • Engineers designing multi-threaded systems
  • Anyone debugging memory leaks or borrow checker errors
  • Developers optimizing for performance (avoiding unnecessary Arc overhead)

m02-resource FAQ

When should I use Arc vs Rc?

Use Arc only if data is shared across threads; otherwise use Rc. Arc has atomic overhead that's unnecessary in single-threaded code.

How do I fix a RefCell panic?

Use try_borrow() instead of borrow() to handle conflicts gracefully, or restructure your code to avoid overlapping borrows.

What causes Rc memory leaks?

Circular references (mutual strong references) cause leaks. Break the cycle by using Weak for one direction of the reference.

Should I use Box for small types?

No. Box adds allocation overhead. Use stack allocation by default unless you need heap allocation for recursive types or trait objects.

When do I need Cell vs RefCell?

Use Cell for Copy types with no runtime borrow checking. Use RefCell when you need runtime borrow checking for non-Copy types.

Full instructions (SKILL.md)

Source of truth, from actionbook/rust-skills.


name: m02-resource description: "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, 智能指针, 引用计数, 堆分配" user-invocable: false

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