Bird
Raised Fist0
Rustprogramming~10 mins

Box pointer in Rust - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Box pointer
Create value on stack
↓
Allocate heap memory
↓
Move value to heap
↓
Store heap address in Box pointer
↓
Use Box pointer to access heap value
↓
Box goes out of scope -> heap memory freed
This flow shows how a Box pointer moves a value from stack to heap, stores the heap address, and frees memory when done.
Execution Sample
Rust
fn main() {
    let b = Box::new(5);
    println!("Value in box: {}", b);
}
Creates a Box pointer holding the value 5 on the heap and prints it.
Execution Table
StepActionStackHeapBox PointerOutput
1Declare b with Box::new(5)b (Box pointer)5 (heap)Points to heap address of 5
2Print value inside bb (Box pointer)5 (heap)Points to heap address of 5Value in box: 5
3End of main, b goes out of scopeNo bHeap memory freedNo pointer
💡 b goes out of scope, Box pointer drops and heap memory is freed
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3 (End)
buninitializedBox pointer to heap 5Box pointer to heap 5dropped (no longer exists)
heap memoryempty5 allocated5 allocatedfreed
Key Moments - 3 Insights
Why does the value 5 move to the heap instead of staying on the stack?
Because Box::new allocates memory on the heap and stores the value there, as shown in execution_table step 1 where heap has 5 allocated.
What happens to the heap memory when the Box pointer goes out of scope?
The heap memory is automatically freed when the Box pointer is dropped, as shown in execution_table step 3.
How do we access the value inside the Box pointer?
We use the Box pointer like a smart pointer; println! dereferences it to get the value, shown in execution_table step 2 output.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 1, what does the Box pointer 'b' point to?
AThe value 5 on the stack
BAn uninitialized memory
CThe value 5 on the heap
DThe value 0
💡 Hint
Check the 'Heap' and 'Box Pointer' columns in execution_table step 1
At which step does the heap memory get freed?
AStep 2
BStep 3
CStep 1
DNever
💡 Hint
Look at the 'Heap' column in execution_table step 3
If we print the value inside the Box pointer, what output do we get at step 2?
A"Value in box: 5"
B"Value in box: b"
C"Value in box: 0"
DNo output
💡 Hint
Check the 'Output' column in execution_table step 2
Concept Snapshot
Box pointer in Rust:
- Use Box::new(value) to allocate value on heap
- Box stores heap address on stack
- Access value via dereferencing Box
- Memory freed automatically when Box drops
- Useful for heap allocation and recursive types
Full Transcript
This example shows how Rust's Box pointer works. First, a value 5 is created on the heap using Box::new. The Box pointer 'b' stores the address of this heap memory on the stack. When we print 'b', Rust dereferences the Box to get the value 5. Finally, when 'b' goes out of scope, Rust automatically frees the heap memory. This process helps manage heap allocation safely and efficiently.

Practice

(1/5)
1. What is the main purpose of a Box pointer in Rust?
easy
A. To create multiple mutable references to the same data
B. To automatically clone data when assigned
C. To store data on the heap and keep a pointer on the stack
D. To replace all references with raw pointers

Solution

  1. Step 1: Understand what Box does

    A Box stores data on the heap, while the pointer itself lives on the stack.
  2. Step 2: Compare options with Box behavior

    Only To store data on the heap and keep a pointer on the stack correctly describes this behavior. Other options describe different concepts like cloning or raw pointers.
  3. Final Answer:

    To store data on the heap and keep a pointer on the stack -> Option C
  4. Quick Check:

    Box = heap data + stack pointer [OK]
Hint: Box always stores data on heap, pointer on stack [OK]
Common Mistakes:
  • Thinking Box allows multiple mutable references
  • Confusing Box with cloning or copying
  • Assuming Box replaces raw pointers
2. Which of the following is the correct syntax to create a Box containing the integer 10 in Rust?
easy
A. let b = Box::new(10);
B. let b = box 10;
C. let b = Box(10);
D. let b = new Box(10);

Solution

  1. Step 1: Recall Box creation syntax

    In Rust, Box::new(value) is the correct way to create a Box pointer.
  2. Step 2: Check each option

    let b = Box::new(10); uses Box::new(10), which is correct. let b = box 10; uses deprecated syntax. let b = Box(10); and let b = new Box(10); are invalid.
  3. Final Answer:

    let b = Box::new(10); -> Option A
  4. Quick Check:

    Box::new(value) creates a Box [OK]
Hint: Use Box::new(value) to create a Box pointer [OK]
Common Mistakes:
  • Using deprecated 'box' keyword
  • Trying to call Box like a function
  • Using 'new Box' which is invalid
3. What will be the output of this Rust code?
let b = Box::new(5);
println!("{}", *b + 3);
medium
A. Compilation error
B. 53
C. 5
D. 8

Solution

  1. Step 1: Understand dereferencing Box

    The *b dereferences the Box to get the value 5 stored on the heap.
  2. Step 2: Calculate the expression

    Adding 3 to 5 gives 8, so the printed output is 8.
  3. Final Answer:

    8 -> Option D
  4. Quick Check:

    *b + 3 = 8 [OK]
Hint: Dereference Box with * to access value [OK]
Common Mistakes:
  • Printing Box pointer without dereference
  • Concatenating instead of adding
  • Expecting compilation error due to Box
4. Identify the error in this Rust code using Box:
let b = Box::new(10);
let r1 = &b;
let r2 = &mut b;
println!("{} {}", r1, r2);
medium
A. Box::new requires a mutable variable
B. Cannot borrow `b` as mutable because it is already borrowed as immutable
C. Box cannot be printed with println!
D. No error, code runs fine

Solution

  1. Step 1: Analyze borrowing rules

    Rust does not allow mutable and immutable borrows at the same time. Here, r1 is an immutable borrow, and r2 is a mutable borrow of b.
  2. Step 2: Identify the error

    This causes a compile-time error: cannot borrow as mutable because already borrowed as immutable.
  3. Final Answer:

    Cannot borrow `b` as mutable because it is already borrowed as immutable -> Option B
  4. Quick Check:

    Mutable + immutable borrow conflict = error [OK]
Hint: Cannot mix mutable and immutable borrows simultaneously [OK]
Common Mistakes:
  • Thinking Box cannot be printed
  • Assuming Box::new needs mut
  • Ignoring Rust's borrowing rules
5. Given this recursive enum using Box:
enum List {
    Cons(i32, Box<List>),
    Nil,
}

fn main() {
    let list = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil))));
}
Why is Box necessary in this definition?
hard
A. To allocate recursive data on the heap and avoid infinite size
B. To allow multiple ownership of the list elements
C. To automatically clone the list elements
D. To make the enum implement Copy trait

Solution

  1. Step 1: Understand recursive enum size problem

    Recursive enums like List have infinite size if they directly contain themselves.
  2. Step 2: Role of Box in recursion

    Using Box stores the recursive part on the heap, giving a fixed pointer size on the stack, avoiding infinite size.
  3. Final Answer:

    To allocate recursive data on the heap and avoid infinite size -> Option A
  4. Quick Check:

    Box breaks infinite size recursion by heap allocation [OK]
Hint: Use Box to break infinite size in recursive types [OK]
Common Mistakes:
  • Thinking Box allows multiple ownership
  • Assuming Box clones data automatically
  • Believing Box makes enum Copy
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard