gpt4 book ai didi

rust - 如何解构/移出 Drop 实现类型?

转载 作者:行者123 更新时间:2023-12-05 08:10:38 25 4
gpt4 key购买 nike

我有一个托管指针类型 Uniq , 实现 Drop ,它有一个应该在不运行 drop 的情况下使用它的方法并返回 Box它的分配。

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 的类型完成这种“解构 move ” ?

注意:从字面上看,每个搜索引擎结果都是关于人们不理解 move 语义的。我确实了解 move 语义,我正在尝试利用它们来确保内存安全,但我不知道如何做。我宁愿不转换 ManuallyDrop<Box<T>>到不太安全的地方-但是-Copy喜欢NonNull<T> .

最佳答案

使用ManuallyDrop::take() :

fn into_parts(mut self) -> (Box<T>, Metadata) {
(unsafe { ManuallyDrop::take(&mut self.data) }, self.metadata)
}

编辑:正如@FilipeRodrigues 正确提到的那样,如果您的 Drop 实现尝试进行清理,您还需要通过 std 阻止它运行: :mem::forget() 或通过将 self 包装在 ManuallyDrop 中。

关于rust - 如何解构/移出 Drop 实现类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72301237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com