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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:20:56