デアロケーティング
次に、大量のリソースをリークしてしまわないよう、 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);
}
}
}
}