Struct std::mem::ManuallyDrop
1.20.0 · source · #[repr(transparent)]pub struct ManuallyDrop<T>where
T: ?Sized,{ /* private fields */ }
Expand description
包装器,用于禁止编译器自动调用 T 的析构函数。 该包装器的成本为 0。
ManuallyDrop<T>
保证与 T
具有相同的布局,并受到与 T
相同的布局优化的约束。因此,它在编译器对其内容进行假设的前提下具有 no 效果。
例如,用 mem::zeroed
初始化 ManuallyDrop<&mut T>
是未定义的行为。如果需要处理未初始化的数据,请改用 MaybeUninit<T>
。
请注意,访问 ManuallyDrop<T>
内部的值是安全的。
这意味着其内容已被丢弃的 ManuallyDrop<T>
一定不能通过公共安全 API 公开。
相应地,ManuallyDrop::drop
是不安全的。
ManuallyDrop
和丢弃顺序。
Rust 具有定义明确的 丢弃顺序 值。为确保按特定顺序丢弃字段或局部变量,请对声明重新排序,以使隐式丢弃顺序正确。
可以使用 ManuallyDrop
来控制丢弃顺序,但这需要不安全的代码,并且在展开状态下很难正确执行。
例如,如果您想要确保一个特定的字段在其他字段之后被丢弃,将它作为结构的最后一个字段:
struct Context;
struct Widget {
children: Vec<Widget>,
// `context` 将在 `children` 之后被丢弃。
// Rust 保证按声明顺序丢弃字段。
context: Context,
}
RunImplementations§
source§impl<T> ManuallyDrop<T>
impl<T> ManuallyDrop<T>
const: 1.32.0 · sourcepub const fn new(value: T) -> ManuallyDrop<T>
pub const fn new(value: T) -> ManuallyDrop<T>
const: 1.32.0 · sourcepub const fn into_inner(slot: ManuallyDrop<T>) -> T
pub const fn into_inner(slot: ManuallyDrop<T>) -> T
1.42.0 · sourcepub unsafe fn take(slot: &mut ManuallyDrop<T>) -> T
pub unsafe fn take(slot: &mut ManuallyDrop<T>) -> T
从 ManuallyDrop<T>
容器中取出值。
此方法主要用于在 drop 中移出值。
您可以使用此方法获取值并根据需要使用它,而不是使用 ManuallyDrop::drop
手动删除该值。
只要有可能,最好改用 into_inner
,这样可以防止重复 ManuallyDrop<T>
的内容。
Safety
该函数从语义上移出所包含的值,而不会阻止进一步使用,从而使该容器的状态保持不变。
您有责任确保不再使用此 ManuallyDrop
。
source§impl<T> ManuallyDrop<T>where
T: ?Sized,
impl<T> ManuallyDrop<T>where T: ?Sized,
sourcepub unsafe fn drop(slot: &mut ManuallyDrop<T>)
pub unsafe fn drop(slot: &mut ManuallyDrop<T>)
手动丢弃包含的值。这完全等同于使用指向所包含值的指针来调用 ptr::drop_in_place
。
这样,除非所包含的值是包装的结构体,否则析构函数将在不移动值的情况下就地调用,因此可用于安全地丢弃 固定 数据。
如果您拥有该值的所有权,则可以改用 ManuallyDrop::into_inner
。
Safety
此函数运行包含值的析构函数。
除了析构函数本身所做的更改之外,内存保持不变,因此就编译器而言,仍然保留一种对于 T
类型有效的位模式。
但是,此 “zombie” 值不应暴露给安全代码,并且不应多次调用此函数。
在丢弃值或多次丢弃值后使用该值可能会导致未定义行为 (取决于 drop
的作用)。
类型系统通常会阻止这种情况,但是 ManuallyDrop
的用户必须在没有编译器帮助的情况下遵守这些保证。
Trait Implementations§
source§impl<T> Clone for ManuallyDrop<T>where
T: Clone + ?Sized,
impl<T> Clone for ManuallyDrop<T>where T: Clone + ?Sized,
source§fn clone(&self) -> ManuallyDrop<T>
fn clone(&self) -> ManuallyDrop<T>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
执行复制分配。 Read more