Rust中临时String值的生命周期及后续引用问题
Rust临时字符串的生命周期与后续访问问题
先看你提供的代码:
fn main(){ let mut s = "Hi".to_string(); s.push_str(&" foo".to_string()); println!("{}",s); }
问题1:foo这个值的生命周期位置在哪里?
" foo".to_string()创建的是一个临时String值,Rust编译器会自动延长它的生命周期,确保它在push_str函数调用的整个过程中保持有效。具体来说,这个临时值会存活到push_str执行完毕(也就是当前表达式s.push_str(...)结束时),之后就会被Rust的所有权系统自动回收释放内存。
问题2:如何在println之后以引用形式访问foo?
你无法直接在println!之后访问这个临时foo的引用。因为这个临时String没有绑定到任何变量,push_str执行完成后它就会被销毁,内存被释放,此时再尝试引用它会造成悬垂引用,这是Rust安全机制严格禁止的。
如果想要后续还能访问foo的引用,必须把这个String绑定到一个具名变量上,通过变量来延长它的生命周期,示例代码如下:
fn main(){ let mut s = "Hi".to_string(); let foo = " foo".to_string(); // 将字符串绑定到变量foo s.push_str(&foo); println!("{}", s); println!("{}", &foo); // println之后可以正常访问foo的引用 }
内容的提问来源于stack exchange,提问作者akhildevelops
相关产品推荐
相关产品推荐

