9.4. 回收资源
原文链接:doc.rust-lang.org/nomicon/vec-deal...
回收资源
接下来我们应该实现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);
            }
        }
    }
} 
           Rust 高级编程
Rust 高级编程 
             
             关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号