面试题答案
一键面试Box
- 所有权转移:
Box
用于将数据分配到堆上,并拥有这个数据的唯一所有权。当Box
被传递给函数或赋值给另一个变量时,所有权发生转移。 - 内存释放:当
Box
离开其作用域,Box
被销毁,它所指向的堆内存也会被释放。
示例代码:
struct MyStruct {
data: i32
}
fn use_box(boxed: Box<MyStruct>) {
println!("Data in box: {}", boxed.data);
// boxed离开此函数作用域时被销毁,内存释放
}
fn main() {
let my_box = Box::new(MyStruct { data: 42 });
use_box(my_box);
// 这里my_box不再有效,因为所有权已经转移到use_box函数中
}
Rc
- 所有权共享:
Rc
(引用计数)允许在多个变量之间共享数据的所有权。每个Rc
实例都维护一个引用计数,记录有多少个Rc
指向同一数据。 - 内存释放:当最后一个指向数据的
Rc
实例被销毁,引用计数降为0,此时堆上的数据才会被释放。
示例代码:
use std::rc::Rc;
struct MyStruct {
data: i32
}
fn use_rc(shared: Rc<MyStruct>) {
println!("Data in rc: {}", shared.data);
// shared离开此函数作用域时,引用计数减1,但数据不会立即释放
}
fn main() {
let my_rc = Rc::new(MyStruct { data: 42 });
let rc_clone = my_rc.clone();
use_rc(my_rc);
use_rc(rc_clone);
// 这里my_rc和rc_clone离开作用域,引用计数降为0,数据释放
}
总结来说,Box
适用于需要唯一所有权的场景,而Rc
适用于需要在多个地方共享只读数据所有权的场景。