释放内存
接下来,我们应该实现 Drop trait,以避免大量资源泄漏。最简单的方法是不断调用 pop
直到返回 None,然后释放我们的缓冲区。请注意,如果 T: !Drop
,则无需调用 pop
。理论上,我们可以询问 Rust T
是否 needs_drop
,并省略对 pop
的调用。然而,实际上 LLVM 非常擅长删除像这样的简单无副作用的代码,所以我不会为此烦恼,除非你注意到它没有被删除(在这种情况下,它被删除了)。
当 self.cap == 0
时,我们绝不能调用 alloc::dealloc
,因为在这种情况下,我们实际上没有分配任何内存。
impl<T> Drop for Vec<T> {
fn drop(&mut self) {
if self.cap != 0 {
while let Some(_) = self.pop() { }
let layout = Layout::array::<T>(self.cap).unwrap();
unsafe {
alloc::dealloc(self.ptr.as_ptr() as *mut u8, layout);
}
}
}
}