面试题答案
一键面试-
普通值解引用与所有权
- 在Rust中,解引用操作符
*
用于获取指针指向的值。当对一个具有所有权的值进行解引用时,所有权本身不会发生变化。例如:
let num = 5; let num_ref = # let deref_num = *num_ref;
这里
num
拥有值5
的所有权,num_ref
是指向num
的引用,通过*num_ref
解引用获取到值5
,但num
的所有权仍然归num
变量,不会因为解引用而转移。 - 在Rust中,解引用操作符
-
智能指针Box解引用
Box
是Rust中的智能指针,用于在堆上分配数据。当对Box
进行解引用时,也不会转移所有权。例如:
let boxed_num = Box::new(10); let deref_boxed_num = *boxed_num;
这里
boxed_num
拥有堆上值10
的所有权,通过*boxed_num
解引用获取到值10
,解引用后所有权转移到deref_boxed_num
上。但这与普通变量不同的是,Box
会在其离开作用域时自动释放堆上的内存,而普通变量在栈上存储,其内存释放由栈的机制控制。- 同时,
Box
实现了Deref
特征,这使得可以像使用普通引用一样使用Box
,例如:
let boxed_str = Box::new(String::from("hello")); let len = boxed_str.len(); // 这里 `boxed_str` 自动解引用,因为 `Box` 实现了 `Deref` 特征
-
智能指针Rc解引用
Rc
(引用计数)智能指针允许多个所有者共享同一个值。当对Rc
进行解引用时,同样不会转移所有权。例如:
use std::rc::Rc; let rc_num = Rc::new(20); let deref_rc_num = *rc_num;
这里
rc_num
是指向堆上值20
的Rc
智能指针,通过*rc_num
解引用获取到值20
,但rc_num
仍然拥有对该值的引用(共享所有权)。Rc
实现了Deref
特征,这意味着可以像使用普通引用一样使用Rc
。例如:
use std::rc::Rc; let rc_str = Rc::new(String::from("world")); let len = rc_str.len(); // 这里 `rc_str` 自动解引用,因为 `Rc` 实现了 `Deref` 特征
- 特殊考量:由于
Rc
是基于引用计数的,每次克隆(clone
)Rc
时,引用计数增加;当Rc
离开作用域,引用计数减少。当引用计数降为0时,值才会被释放。在解引用Rc
时,要注意多个Rc
共享值的情况,以避免内存泄漏或悬空指针问题。例如,如果一个Rc
指向的结构体内部又包含指向该结构体自身的Rc
,可能会导致循环引用,使得引用计数永远不会为0,从而造成内存泄漏。