Rust 回收资源
我们应该实现Drop,否则就要造成大量的资源泄露了。最简单的方法是循环调用pop
直到产生None为止,然后再回收我们的缓存。注意,当T: !Drop
的时候,调用pop
不是必须的。理论上我们可以问一问RustT
是不是need_drop
然后再省略一些pop
调用。可实际上LLVM很擅长移除像这样的无副作用的代码,所以我们不需要再做多余的事,除非你发现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_ptr() as *mut _, num_bytes, align); } } } }
我们已经实现了一个成熟的栈。我们可以push、可以pop、也可以自动清理。但是还是有一堆的功能是我们需要的。特别是,我们已经有了一个很好的数组,但是还没有slice相关的功能。这非常容易解决:我们可以实现Deref&l ...