You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的具体流程:

  1. let mut x = String::from("Hello, world!");:x持有"Hello, world!"的所有权,该字符串的实际数据存储在堆内存中,x在栈上存储指向堆数据的指针、长度和容量。
  2. println!("{}", x);:仅以不可变借用的方式使用x,所有权仍归x所有,借用结束后无残留影响。
  3. x = String::from("Lorem, ipsum!");:
    • 首先创建新字符串"Lorem, ipsum!",x接管这个新字符串的所有权。
    • 旧字符串"Hello, world!"的所有权被丢弃,Rust自动回收其堆内存,不需要手动干预。

另外需要注意:如果在赋值时旧值还被活跃的引用持有(比如存在未失效的&x或&mut x),Rust编译器会直接报错,因为这违反了"引用必须始终有效"的规则,避免了悬垂引用的问题。

内容的提问来源于stack exchange,提问作者KianFakheriAghdam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:45:23