为何Rust示例代码1的变量x仍有值而代码2的s2无有效取值
Rust两段代码运行差异原因解释
代码1可正常输出x的原因
代码1中的x是i32整型,属于Rust的基础标量类型,数据完全存储在栈空间,默认实现了Copy trait。
执行let y = x+1时,只会直接复制x在栈上的数值给新变量y,不会触发所有权转移,x本身的所有权没有发生任何变更,因此后续可以正常读取x的值。
代码2无法输出s2的原因
代码2中的s2是String动态字符串类型,数据分为两部分存储:元数据(指针、长度、容量)存在栈上,实际字符串内容存在堆上。String类型没有实现Copy trait,赋值时默认触发所有权转移(Move):
- 仅拷贝
s2栈上的元数据给新变量s4 - Rust会自动标记原有变量
s2为失效状态,避免两个变量同时持有同一块堆内存的引用、引发双重释放等内存安全问题
此时s2已经失去对应堆内存的所有权,属于无效变量,编译器会直接禁止后续对s2的读取操作,因此无法正常输出。
可选解决方案
如果需要赋值后仍保留s2的有效性,可调用clone方法执行深拷贝,同时复制栈上元数据和堆上的字符串内容:
let mut s2 = String::from("Tôi tên là"); let s4 = s2.clone(); println!("{}",s4); println!("{}",s2); // 可正常输出
内容的提问来源于stack exchange,提问作者phuc hung
相关产品推荐
相关产品推荐

