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的结构呢?蟹蟹
1
共 2 条评论, 1 页
评论区
写评论明白你的意思了,Thanks♪(・ω・)ノ
--
👇
包布丁: 如果给 node 调用 drop 时发生了一次 panic,程序会开始 unwind,当前拥有所有权的对象将被析构。但 LinkedList 是手动管理对象所有权的,直接 unwind 会导致余下的 node 泄漏。有了 DropGuard,unwind 的时候就有机会处理剩余的 node 防止泄漏。如果此时又发生了 panic,程序会直接 abort。
如果给 node 调用 drop 时发生了一次 panic,程序会开始 unwind,当前拥有所有权的对象将被析构。但 LinkedList 是手动管理对象所有权的,直接 unwind 会导致余下的 node 泄漏。有了 DropGuard,unwind 的时候就有机会处理剩余的 node 防止泄漏。如果此时又发生了 panic,程序会直接 abort。