Rust可变变量与String:首个String何时被释放?
Rust中String赋值时的内存释放时机
针对你给出的代码:
{ let mut a = String::from("Foo"); a = String::from("Bar"); }
第一个String(持有"Foo"的那个)会在执行a = String::from("Bar")这个赋值操作时被释放,而非等到作用域结束。
原因解析
Rust的所有权规则决定了:对于没有实现Copy trait的类型(比如String这类堆分配类型),当你将新值赋值给变量时,旧值的所有权会被覆盖,此时旧值的Drop trait会立即被调用,它所占用的堆内存也会随之被释放。
如果是实现了Copy的类型(比如i32、bool),赋值时会复制旧值,旧值不会被销毁,但String因为涉及堆内存管理,没有实现Copy,所以赋值操作会触发旧值的销毁逻辑。
直观验证
你可以通过自定义一个实现Drop的类型来观察销毁时机:
struct TrackDrop(&'static str); impl Drop for TrackDrop { fn drop(&mut self) { println!("Dropped: {}", self.0); } } fn main() { let mut a = TrackDrop("Foo"); a = TrackDrop("Bar"); println!("End of scope"); }
运行这段代码会输出:
Dropped: Foo End of scope Dropped: Bar
清晰可见,持有"Foo"的实例在赋值操作完成后就被销毁了,而持有"Bar"的实例才会等到作用域结束时释放。
内容的提问来源于stack exchange,提问作者Kain
相关产品推荐
相关产品推荐

