当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust ManuallyDrop用法及代码示例


本文简要介绍rust语言中 Struct std::mem::ManuallyDrop 的用法。

用法

#[repr(transparent)]pub struct ManuallyDrop<T> where    T: ?Sized,  { /* fields omitted */ }

禁止编译器自动调用 T 的析构函数的包装器。这个包装器是 0 成本的。

ManuallyDrop<T>受到相同的布局优化T。结果,它有没有效果基于编译器对其内容所做的假设。例如,初始化一个ManuallyDrop<&mut T>std::mem::zeroed是未定义的行为。如果需要处理未初始化的数据,请使用std::mem::MaybeUninit反而。

请注意,访问 ManuallyDrop<T> 中的值是安全的。这意味着不得通过公共安全 API 公开其内容已被删除的 ManuallyDrop<T>。相应地,ManuallyDrop::drop 是不安全的。

ManuallyDrop 和删除订单。

Rust 有一个明确定义的 drop order 值。要确保按特定顺序删除字段或局部变量,请对声明重新排序,以使隐式删除顺序正确。

可以使用ManuallyDrop 来控制放置顺序,但这需要不安全的代码,并且在存在展开的情况下很难正确执行。

例如,如果您想确保将特定字段放在其他字段之后,请将其设置为结构的最后一个字段:

struct Context;

struct Widget {
    children: Vec<Widget>,
    // `context` will be dropped after `children`.
    // Rust guarantees that fields are dropped in the order of declaration.
    context: Context,
}

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::mem::ManuallyDrop。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。