如何破坏/脱离实施类型?
我有一个托管指针类型 uniq
,实现 drop
,该方法应在不运行 drop
的情况下消耗它,然后返回框
其分配的。
struct Uniq<T> { data: ManuallyDropped<Box<T>>, metadata: Metadata }
impl Uniq<T> {
fn into_parts(/* mut */ self) -> (Box<T>, Metadata) {
(ManuallyDrop::into_inner(self.data), self.metadata) // doesn't work
// let Self { data, metadata } = self; // doesn't work either
}
}
impl<T> Drop for Uniq<T> {
fn drop(&mut self) {
// fancy_management_ledgerwork(self.metadata)
}
}
#[derive(Clone, Copy)]
struct Metadata(usize);
我如何为我的类型完成这种“破坏性移动”,哪种实现 drop
?
注意:从字面上看,每个搜索引擎的结果都是关于人们不了解移动语义。我 do 了解移动语义,我正在尝试利用它们以确保记忆安全,我无法弄清楚如何。我宁愿不要将 ManallyDrop&lt; box&lt; t&gt;&gt;
转换为较少安全的东西,复制喜欢 nonnull&lt; t&gt;
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 :
编辑: @filiperodrigues正确地提到,如果您的
drop
实现尝试进行清理,您还需要防止其运行,要么通过std :: mem :: best()
或通过self
在手动drop
中包装。Use
ManuallyDrop::take()
:Edit: As correctly mentioned by @FilipeRodrigues, if your
Drop
implementation tries to do cleanup you also need to prevent it from running, either bystd::mem::forget()
or by wrappingself
inManuallyDrop
.此编译:
This compiles: