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. }