rust中当vec被析构时,会顺带清掉里面存储的值吗?

rust中当vec被析构时,会顺带清掉里面存储的值吗?
比如vec![1,2,3,4] 当这个vec离开作用域被清掉时,会不会顺带清掉里面存储的值?如果vec里面是box,box指向的值是不是也会被清掉?

阅读 2.8k
4 个回答

重点是值的所有权,与存储位置无关。

这样没问题:

// OK
fn main() {
    let s = "string".to_string();
    {
        let vec = vec![&s];
    }
    println!("{}", s);
}

这个不行,哪怕是 Box

// Error
fn main() {
    let s = Box::new("string".to_string());
    {
        let vec = vec![s];
    }
    println!("{}", s);
}

是的,会清理掉。

vec 里是 box ,vec 会清理 box ,box 指向的值是 Box 负责清理的。

要深究可以了解一下 Drop trait

Vec 是 RAII 的类型,在析构的时候需要释放原本所持有的内存空间,包括其中的数据。实现这个效果我们可以看 impl<T, A> Drop for Vec<T, A> where A: Allocator:

#[stable(feature = "rust1", since = "1.0.0")]
unsafe impl<#[may_dangle] T, A: Allocator> Drop for Vec<T, A> {
    fn drop(&mut self) {
        unsafe {
            // use drop for [T]
            // use a raw slice to refer to the elements of the vector as weakest necessary type;
            // could avoid questions of validity in certain cases
            ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
        }
        // RawVec handles deallocation
    }
}

可以看到,在 Vec 完成了自己的生产周期之后,它就会将自己的内容通过 ptr::drop_in_place 方法原地释放。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进