外部の理由MaybeUninit
でを使用する単純なリソースがあります。unsafe
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
ます。どうすればこれを防ぐことができますか?そうすることは慣用的でしょうか? ドキュメントには次のように記載されています。
a will が巻き戻されるとき
panic!
に呼び出されることを考えると、実装内のいずれかが中止される可能性があります。drop
panic!
drop
しかし、その「可能性が高い」だけでは、このシナリオを予想する必要がある (そして処理できる) かどうかが十分に明確になりません。