Skip to content

Instantly share code, notes, and snippets.

main {
A = 1 // create A
loop {
B = 2 // create B
// delete B
}
// delete A
}
main {
A = allocate() // acquire
do_stuff(A) // use
release(A) // release
// delete pointer
}
main {
A = allocate() // acquire
do_stuff(A) // use
// <RUN TIME FAIL> never release
// delete pointer
}
main {
A = allocate() // acquire
release(A) // release
do_stuff(A) // <RUN TIME FAIL> use invalid pointer
// delete pointer
}
main {
A = allocate() // acquire
do_stuff(A) // use
release(A) // release
release(A) // <RUN TIME FAIL> release invalid pointer
// delete pointer
}
main {
...
A = <pointer to>──────┐
... |
} │
╔══ HEAP ALLOCATED ════════╗
║ AA = "reachable" ║
║ AB = <pointer to>──────┐ ║
╚════════════════════════│═╝
main {
A = allocate() // acquire
do_stuff(A) // use
release(A) // release, pointer owns allocation
// delete pointer
}
do_stuff(B) {
do_more_stuff(B) // use
// don't release, pointer doesn't own allocation
main {
A = allocate() // A's lifetime begins
do_stuff(A) // use A
B = A // B's lifetime begins
do_stuff(B) // use B
release(A) // release, A's and B's lifetimes end
do_stuff(A) // <RUN TIME FAIL> use A after its lifetime ended
do_stuff(B) // <RUN TIME FAIL> use B after its lifetime ended
}
fn my_fn() {
let my_box = Box::new(1234); // acquire
println!("{}", my_box); // use
// delete my_box,
// which releases memory
}
struct MyStruct { // structure definition
my_box: Box<u32>, // it has only 1 field,
// a Box keeping integer on heap
}
fn my_fn() {
let my_struct = MyStruct { // create instance of structure
my_box: Box::new(1234), // acquire memory
};
println!("{}", my_struct.my_box); // use