デアロケーティング

次に、大量のリソースをリークしてしまわないよう、 Drop を実装するべきです。 簡単な方法は、単に pop を、 None が返されるまで呼び出し、そして、 バッファをデアロケートする方法です。もし T: !Drop である場合、 pop を 呼ぶことは必要ない事に注意してください。理論的には、T をドロップする必要が あるかを needs_drop で確かめ、 pop の呼び出しを省略することが出来ます。 しかし実践的には、 LLVM は本当にこのような副作用のない単純なコードを 取り除くことに優れているため、コードが取り除かれていないと気づかない 限りは気にしません (今回はコードが取り除かれています) 。

self.cap == 0 である場合、 heap::deallocate を呼んではいけません。 この時、実際にはメモリをアロケートしていないからです。

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 *mut _, num_bytes, align);
            }
        }
    }
}