m02-resource

Smart pointer and resource ownership patterns for Rust heap allocation and reference counting. Guides ownership decisions through a three-step model: single vs. shared ownership, single-threaded vs. multi-threaded context, and presence of reference cycles Covers six core types (Box, Rc, Arc, Weak, Cell, RefCell) with a decision flowchart and quick reference table for choosing the right pattern Includes common errors and anti-patterns with fixes, such as using Weak to break cycles, avoiding unnecessary Arc overhead, and preventing RefCell panics Traces design questions upward to concurrency and mutability concerns, and downward to concrete implementation choices

INSTALLATION
npx skills add https://github.com/zhanghandong/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

Error

Don't Just Say

Ask 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)

Situation

Trace To

Question

Rc vs Arc confusion

m07-concurrency

What's the concurrency model?

RefCell panics

m03-mutability

Is interior mutability right here?

Memory leaks

m12-lifecycle

Where 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

Type

Ownership

Thread-Safe

Use When

Box<T>

Single

Yes

Heap allocation, recursive types

Rc<T>

Shared

No

Single-thread shared ownership

Arc<T>

Shared

Yes

Multi-thread shared ownership

Weak<T>

Weak ref

Same as Rc/Arc

Break reference cycles

Cell<T>

Single

No

Interior mutability (Copy types)

RefCell<T>

Single

No

Interior 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 &#x26;mut T

Common Errors

Problem

Cause

Fix

Rc cycle leak

Mutual strong refs

Use Weak for one direction

RefCell panic

Borrow conflict at runtime

Use try_borrow or restructure

Arc overhead

Atomic ops in hot path

Consider Rc if single-threaded

Box unnecessary

Data fits on stack

Remove Box

Anti-Patterns

Anti-Pattern

Why Bad

Better

Arc everywhere

Unnecessary atomic overhead

Use Rc for single-thread

RefCell everywhere

Runtime panics

Design clear ownership

Box for small types

Unnecessary allocation

Stack allocation

Ignore Weak for cycles

Memory leaks

Design parent-child with Weak

Related Skills

When

See

Ownership errors

m01-ownership

Interior mutability details

m03-mutability

Multi-thread context

m07-concurrency

Resource lifecycle

m12-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