释放分配(Deallocating)

接下来我们应该实现Drop,这样我们就不会泄漏大量资源最简单的方法是调用pop直到它产生None,然后释放我们的缓冲区.请注意,如果T: !Drop,则不需要调用pop.理论上我们可以询问Rust是否T need_drop并省略对pop的调用.然而在实践中LLVM 非常(really) 擅长移除像这样的简单的无副作用代码,所以除非你注意到它没有被剥离(在这种情况下它是),否则我不会打扰.

self.cap == 0时,我们不能调用alloc::dealloc,因为在这种情况下我们实际上没有分配任何内存.

  1. impl<T> Drop for Vec<T> {
  2. fn drop(&mut self) {
  3. if self.cap != 0 {
  4. while let Some(_) = self.pop() { }
  5. let layout = Layout::array::<T>(self.cap).unwrap();
  6. unsafe {
  7. alloc::dealloc(self.ptr.as_ptr() as *mut u8, layout);
  8. }
  9. }
  10. }
  11. }