rust中当vec被析构时,会顺带清掉里面存储的值吗?
比如vec![1,2,3,4] 当这个vec离开作用域被清掉时,会不会顺带清掉里面存储的值?如果vec里面是box,box指向的值是不是也会被清掉?
rust中当vec被析构时,会顺带清掉里面存储的值吗?
比如vec![1,2,3,4] 当这个vec离开作用域被清掉时,会不会顺带清掉里面存储的值?如果vec里面是box,box指向的值是不是也会被清掉?
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
方法原地释放。
重点是值的所有权,与存储位置无关。
这样没问题:
这个不行,哪怕是
Box
: