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


Rust MaybeUninit.assume_init_read用法及代码示例


本文简要介绍rust语言中 std::mem::MaybeUninit.assume_init_read 的用法。

用法

pub unsafe fn assume_init_read(&self) -> T

MaybeUninit<T> 容器中读取值。生成的T 将接受通常的丢弃处理。

只要有可能,最好使用 assume_init 代替,这样可以防止重复 MaybeUninit<T> 的内容。

安全性

由调用者来保证 MaybeUninit<T> 确实处于初始化状态。当内容尚未完全初始化时调用此方法会导致未定义的行为。 type-level 文档包含有关此初始化不变量的更多信息。

此外,与 ptr::read 函数类似,此函数创建内容的按位副本,无论包含的类型是否实现 Copy 特征。当使用数据的多个副本时(通过多次调用 assume_init_read,或先调用 assume_init_read 然后 assume_init ),您有责任确保数据确实可能重复。

例子

此方法的正确用法:

#![feature(maybe_uninit_extra)]
use std::mem::MaybeUninit;

let mut x = MaybeUninit::<u32>::uninit();
x.write(13);
let x1 = unsafe { x.assume_init_read() };
// `u32` is `Copy`, so we may read multiple times.
let x2 = unsafe { x.assume_init_read() };
assert_eq!(x1, x2);

let mut x = MaybeUninit::<Option<Vec<u32>>>::uninit();
x.write(None);
let x1 = unsafe { x.assume_init_read() };
// Duplicating a `None` value is okay, so we may read multiple times.
let x2 = unsafe { x.assume_init_read() };
assert_eq!(x1, x2);

此方法的错误使用:

#![feature(maybe_uninit_extra)]
use std::mem::MaybeUninit;

let mut x = MaybeUninit::<Option<Vec<u32>>>::uninit();
x.write(Some(vec![0, 1, 2]));
let x1 = unsafe { x.assume_init_read() };
let x2 = unsafe { x.assume_init_read() };
// We now created two copies of the same vector, leading to a double-free ⚠️ when
// they both get dropped!

相关用法


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