m02-resource

CRITICAL: Use for smart pointers and resource management. Triggers: Box, Rc, Arc, Weak, RefCell, Cell, smart pointer, heap allocation, reference counting,…

INSTALLATION
npx skills add https://github.com/actionbook/rust-skills --skill m02-resource
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

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:

-

What's the ownership model?

  • Single owner → Box or owned value
  • Shared ownership → Rc/Arc
  • Weak reference → Weak

-

What's the thread context?

  • Single-thread → Rc, Cell, RefCell
  • Multi-thread → Arc, Mutex, RwLock

-

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 SingleYesHeap allocation, recursive types
Rc SharedNoSingle-thread shared ownership
Arc SharedYesMulti-thread shared ownership
Weak Weak refSame as Rc/ArcBreak reference cycles
Cell SingleNoInterior mutability (Copy types)
RefCell 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
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card