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

为何Rust循环体中的Box未触发内存释放却能正常运行?

关于Rust循环中Box内存释放的疑问解答

问题代码

fn main() {
    println!("Hello, world!");
    let mut x = Box::new(12);
    let mut z = &x;
    for i in 0..100{
        println!("z is {}", *z);
        x = Box::new(i);
        z = &x;
    }
    println!("{}", *z);
    println!("{}", x);
}

问题困惑

按照我的理解,循环体中每次创建的Box应该在循环结束后被释放,但这段代码却能正常运行,希望有人能为我解答这个问题。

解答

你的理解有个关键偏差:循环里的Box确实会被释放,但释放时机不是整个循环结束后,而是每次循环迭代中给x赋值的瞬间。

  • 初始状态下,x持有一个指向堆内存中12的Box。
  • 第一次循环执行x = Box::new(i)时,旧的Box(指向12的那个)会被立刻销毁——因为x的所有权已经转移给新的Box,旧Box失去了所有者,Rust的所有权系统会自动回收它占用的堆内存。
  • 后续每次循环迭代都是同样的逻辑:新Box赋值给x的同时,上一次的Box就会被立即drop,根本不会等到循环结束。
  • 至于引用z,每次循环里都会重新绑定到当前的x上,它的生命周期只覆盖当前迭代到下一次赋值前,不会持有旧Box的引用,所以完全不会出现悬垂引用的问题。

总结来说,Rust中当拥有所有权的值被覆盖时,旧值会被立即销毁,而非等到所在作用域结束。循环的所有迭代都在x的同一个作用域内,因此每次赋值都会触发旧Box的内存释放,代码自然能正常运行。

内容的提问来源于stack exchange,提问作者Z.wk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:08:21