将 mem::uninitialized 替换为 MaybeUninit

Replace mem::uninitialized with MaybeUninit

我正在做一个需要使用文件系统的嵌入式系统项目。我想在 rust 中使用 liitlefs crate,但它使用 mem::uninitialized 自 1.39.0 以来已弃用。 https://github.com/brandonedens/rust-littlefs

pub struct LittleFs<T: Storage> {
    storage: T,
    lfs_config: lfs::lfs_config,
    lfs: lfs::lfs_t,
    read_buffer: [u8; READ_SIZE],
    prog_buffer: [u8; PROG_SIZE],
    lookahead_buffer: [u8; LOOKAHEAD / 8],
}

impl<T: Storage> LittleFs<T> {
    /// Create a new instance of the LittleFS.
    pub fn new(storage: T) -> Self {
        LittleFs {
            storage: storage,
            lfs: unsafe { mem::uninitialized::<lfs::lfs>() },
            lfs_config: unsafe { mem::uninitialized::<lfs::lfs_config>() },
            read_buffer: [0u8; READ_SIZE],
            prog_buffer: [0u8; PROG_SIZE],
            lookahead_buffer: [0u8; LOOKAHEAD / 8],
        }
    }

我尝试用以下方式替换它,但它导致系统出现未指定的行为:

pub struct LittleFs<T: Storage> {
    storage: T,
    lfs_config: lfs::lfs_config,
    lfs: lfs::lfs_t,
    read_buffer: [u8; READ_SIZE],
    prog_buffer: [u8; PROG_SIZE],
    lookahead_buffer: [u8; LOOKAHEAD / 8],
}

impl<T: Storage> LittleFs<T> {
    pub fn new(storage: T) -> Self {
        LittleFs {
            storage,
            lfs: unsafe { MaybeUninit::uninit().assume_init() },
            lfs_config: unsafe { MaybeUninit::uninit().assume_init() },
            read_buffer: [0u8; READ_SIZE],
            prog_buffer: [0u8; PROG_SIZE],
            lookahead_buffer: [0u8; LOOKAHEAD / 8],
        }
    }

有人能解决这个问题吗?提前谢谢你。

你不能做 uninit().assume_init() — 它肯定 没有 初始化。 assume_init() 只有在数据用实际值初始化后才会被调用。调用它背后的想法是你承诺,“是的,我知道这个值被标记为 可能 已初始化。我保证它 现在已经初始化了。这不仅仅是一个 maybe."

您需要更改 lfslfs_config 的类型:

lfs_config: MaybeUninit<lfs::lfs_config>,
lfs: MaybeUninit<lfs::lfs_t>,

这将对下游产生连锁反应,要求您随后修改访问这些字段的任何代码。