< 返回版块

kwanCCC 发表于 2021-12-28 17:29

unsafe impl<#[may_dangle] T> Drop for LinkedList<T> {
    fn drop(&mut self) {
        struct DropGuard<'a, T>(&'a mut LinkedList<T>);

        impl<'a, T> Drop for DropGuard<'a, T> {
            fn drop(&mut self) {
                // Continue the same loop we do below. This only runs when a destructor has
                // panicked. If another one panics this will abort.
                while self.0.pop_front_node().is_some() {}
            }
        }

        while let Some(node) = self.pop_front_node() {
            let guard = DropGuard(self);
            drop(node);
            mem::forget(guard);
        }
    }
}

这里为什么需要一个DropGuard的结构呢?蟹蟹

评论区

写评论
作者 kwanCCC 2021-12-29 14:18

明白你的意思了,Thanks♪(・ω・)ノ

--
👇
包布丁: 如果给 node 调用 drop 时发生了一次 panic,程序会开始 unwind,当前拥有所有权的对象将被析构。但 LinkedList 是手动管理对象所有权的,直接 unwind 会导致余下的 node 泄漏。有了 DropGuard,unwind 的时候就有机会处理剩余的 node 防止泄漏。如果此时又发生了 panic,程序会直接 abort。

包布丁 2021-12-28 19:38

如果给 node 调用 drop 时发生了一次 panic,程序会开始 unwind,当前拥有所有权的对象将被析构。但 LinkedList 是手动管理对象所有权的,直接 unwind 会导致余下的 node 泄漏。有了 DropGuard,unwind 的时候就有机会处理剩余的 node 防止泄漏。如果此时又发生了 panic,程序会直接 abort。

1 共 2 条评论, 1 页