Deallocating - The Rustonomicon
Description: The Dark Arts of Advanced and Unsafe Rust Programming

# Deallocating

Next we should implement Drop so that we don't massively leak tons of resources. The easiest way is to just call `pop` until it yields None, and then deallocate our buffer. Note that calling `pop` is unneeded if `T: !Drop`. In theory we can ask Rust if `T` `needs_drop` and omit the calls to `pop`. However in practice LLVM is really good at removing simple side-effect free code like this, so I wouldn't bother unless you notice it's not being stripped (in this case it is).

We must not call `heap::deallocate` when `self.cap == 0`, as in this case we haven't actually allocated any memory.

    impl<T> Drop for Vec<T> {
        fn drop(&mut self) {
            if self.cap != 0 {
                while let Some(_) = self.pop() { }

                let align = mem::align_of::<T>();
                let elem_size = mem::size_of::<T>();
                let num_bytes = elem_size * self.cap;
                unsafe {
                    heap::deallocate(self.ptr.as_ptr() as *mut _, num_bytes, align);
                }
            }
        }
    }