Rust可变值每次赋值后会发生什么?所有权追踪机制问询
关于Rust可变变量赋值的所有权问题
先看两个示例:
示例1
pub fn main() { let mut x = String::from("Hello"); println!("{}", x); x = format!("{x}, world!"); println!("{}", x); }
这里x是可变变量,format!宏以不可变借用的方式使用x生成新字符串,之后新字符串的所有权被转移给x。
示例2
pub fn main() { let mut x = String::from("Hello, world!"); println!("{}", x); x = String::from("Lorem, ipsum!"); println!("{}", x); }
核心疑问解答
你的猜想并不正确,Rust不会根据新值是否依赖旧值来决定是否丢弃旧值,而是遵循明确的所有权规则:
当对可变变量执行重新赋值操作时,只要旧值没有被活跃的借用(即没有未失效的引用指向它),旧值的所有权就会被立即释放,Rust会自动调用其Drop trait的实现,回收堆上占用的内存空间。
针对示例2的具体流程:
let mut x = String::from("Hello, world!");:x持有"Hello, world!"的所有权,该字符串的实际数据存储在堆内存中,x在栈上存储指向堆数据的指针、长度和容量。println!("{}", x);:仅以不可变借用的方式使用x,所有权仍归x所有,借用结束后无残留影响。x = String::from("Lorem, ipsum!");:- 首先创建新字符串"Lorem, ipsum!",
x接管这个新字符串的所有权。 - 旧字符串"Hello, world!"的所有权被丢弃,Rust自动回收其堆内存,不需要手动干预。
- 首先创建新字符串"Lorem, ipsum!",
另外需要注意:如果在赋值时旧值还被活跃的引用持有(比如存在未失效的&x或&mut x),Rust编译器会直接报错,因为这违反了"引用必须始终有效"的规则,避免了悬垂引用的问题。
内容的提问来源于stack exchange,提问作者KianFakheriAghdam
相关产品推荐
相关产品推荐

