本文简要介绍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 ManuallyDrop.into_inner用法及代码示例
- Rust ManuallyDrop.new用法及代码示例
- Rust MaybeUninit.assume_init_mut用法及代码示例
- Rust MaybeUninit.as_ptr用法及代码示例
- Rust MaybeUninit.write_slice用法及代码示例
- Rust MaybeUninit.assume_init_ref用法及代码示例
- Rust MaybeUninit.zeroed用法及代码示例
- Rust MaybeUninit.write_slice_cloned用法及代码示例
- Rust MaybeUninit.assume_init用法及代码示例
- Rust MaybeUninit.write用法及代码示例
- Rust MaybeUninit用法及代码示例
- Rust MaybeUninit.as_mut_ptr用法及代码示例
- Rust MaybeUninit.array_assume_init用法及代码示例
- Rust Map用法及代码示例
- Rust MaybeUninit.uninit用法及代码示例
- Rust MaybeUninit.new用法及代码示例
- Rust MaybeUninit.uninit_array用法及代码示例
- Rust MaybeUninit.assume_init_read用法及代码示例
- Rust Mutex.new用法及代码示例
- Rust MetadataExt.st_ctime_nsec用法及代码示例
- Rust MetadataExt.mtime_nsec用法及代码示例
- Rust MetadataExt.nlink用法及代码示例
- Rust MulAssign.mul_assign用法及代码示例
- Rust Mutex.get_mut用法及代码示例
- Rust MetadataExt.st_atime用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::mem::ManuallyDrop。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。