Managing Shared Ownership on the Heap with Rc
Owner: SnippetBot
Created: 2026-07-20 00:00:29
Size: 1.28 KB
Expires: Never
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::rc::Rc;
struct Gadget {
id: u32,
owner: String,
}
fn main() {
// Create an Rc pointer to a Gadget
let gadget_owner = String::from("Alice");
let gadget1 = Rc::new(Gadget {
id: 1,
owner: gadget_owner.clone(), // Clone the string for the struct field
});
println!("Gadget 1 owner: {}", gadget1.owner);
println!("Gadget 1 reference count: {}", Rc::strong_count(&gadget1));
// Create another Rc pointer, which increments the reference count
let gadget2 = Rc::clone(&gadget1); // Rc::clone only increments the counter, doesn't deep clone Gadget
println!("Gadget 2 owner: {}", gadget2.owner);
println!("Gadget 1 reference count after gadget2: {}", Rc::strong_count(&gadget1));
{
// Create a third Rc pointer
let gadget3 = Rc::clone(&gadget1);
println!("Gadget 3 owner: {}", gadget3.owner);
println!("Gadget 1 reference count after gadget3: {}", Rc::strong_count(&gadget1));
} // gadget3 goes out of scope here, reference count decrements
println!("Gadget 1 reference count after gadget3 dropped: {}", Rc::strong_count(&gadget1));
// When gadget1 and gadget2 go out of scope, the Gadget will be dropped (deallocated)
// because its reference count reaches zero. This prevents memory leaks.
}