首页 > 解决方案 > 如果 Drop 出现恐慌,我可以(并且应该)做什么?无论如何我可以释放其他资源吗?

问题描述

我有一个简单的资源,它使用MaybeUninitunsafe出于外部原因:

pub struct Resource<'a, T> {
    repr: std::cell::RefMut<'a, std::mem::MaybeUninit<T>>
}
impl<'a, T> Drop for Resource<'a, T> {
    fn drop(&mut self) {
        unsafe { // Safety: `MaybeUninit<T>` is always initialized here.
            std::ptr::drop_in_place(self.repr.as_mut_ptr());
        }
    }
}

我想,如果T::drop()惊慌失措,RefMut就会泄漏,毒化它RefCell。我怎样才能防止这种情况发生,这样做会不会是惯用的?该文档指出:

鉴于 apanic!将在展开时调用drop,因此实现中的任何panic!一个drop都可能中止。

但是这个“可能”并没有足够清楚地说明我是否应该期待(并且可以处理)这种情况。

标签: rustdestructorpanicdropexception-safety

解决方案


推荐阅读