为何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
相关产品推荐
相关产品推荐

