释放内存

接下来我们应该实现 Drop 特性,这样我们就不会大量泄漏资源。最简单的方法是调用 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);
            }
        }
    }
}