2 个稳定版本
1.1.0 | 2021年11月29日 |
---|---|
1.0.0 | 2020年8月3日 |
#104 在 内存管理 中
75,915 每月下载量
用于 47 个 Crates(12 个直接使用)
10KB
96 行
pin-weak
这个 crate 为 Pin<std::rc::Rc<T>>
和 Pin<std::rc::Arc<T>>
提供了弱引用
动机
Pin<std::rc::Rc<T>>
和 Pin<std::rc::Arc<T>>
如果 T
没有实现 Unpin
,则不能安全地转换为它们的 Weak
等效物。这是因为如果这样做,就会发生类似以下情况:
struct SomeStruct(PhantomPinned);
let pinned = Rc::pin(SomeStruct(PhantomPinned));
// This is unsafe ...
let weak = unsafe {
Rc::downgrade(&Pin::into_inner_unchecked(pinned.clone()))
};
// ... because otherwise it would be possible to move the content of pinned:
let mut unpinned_rc = weak.upgrade().unwrap();
std::mem::drop((pinned, weak));
// unpinned_rc is now the only reference so this will work:
let x = std::mem::replace(
Rc::get_mut(&mut unpinned_rc).unwrap(),
SomeStruct(PhantomPinned),
);
在这个例子中,x
是原始的 SomeStruct
,我们将其移动到内存中,这是未定义的行为,请不要这样做。
PinWeak
这个 crate 简单地提供 rc::PinWeak
和 sync::PinWeak
,允许从 Pin<std::rc::Rc>
和 Pin<srd::sync::Arc>
获取弱引用。
这是安全的,因为在尝试升级弱引用时,只能从其中获取一个 Pin
。
PinWeak
可以使用 PinWeak
降级函数创建。
示例
use pin_weak::rc::*;
struct SomeStruct(PhantomPinned, usize);
let pinned = Rc::pin(SomeStruct(PhantomPinned, 42));
let weak = PinWeak::downgrade(pinned.clone());
assert_eq!(weak.upgrade().unwrap().1, 42);
std::mem::drop(pinned);
assert!(weak.upgrade().is_none());
许可证
MIT