Освобождение
Следующее, что мы должны сделать - это реализовать Drop так, чтобы у нас не происходила широкомасштабная утечка кучи ресурсов. Самым простым способом будет вызывать pop
до тех пор пока он не вернёт None, и затем освободить наш буфер. Помните, что вызов pop
не нужен, если T: !Drop
. В теории мы можем спросить у Rust, является ли T
needs_drop
и избежать вызова pop
. Однако, на практике, LLVM действительно хорош в удалении такого простого независимого кода без побочных эффектов, поэтому я бы не стал беспокоится, если только вы не заметите, что он не удалён (в этом случае он будет удалён).
Мы не должны вызывать heap::deallocate
, если self.cap == 0
, так как в этом случае мы ещё на самом деле не выделили память.
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);
}
}
}
}