将 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."
您需要更改 lfs
和 lfs_config
的类型:
lfs_config: MaybeUninit<lfs::lfs_config>,
lfs: MaybeUninit<lfs::lfs_t>,
这将对下游产生连锁反应,要求您随后修改访问这些字段的任何代码。
- 用
write
初始化它们。
- 阅读
assume_init_ref
or assume_init_mut
。
我正在做一个需要使用文件系统的嵌入式系统项目。我想在 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."
您需要更改 lfs
和 lfs_config
的类型:
lfs_config: MaybeUninit<lfs::lfs_config>,
lfs: MaybeUninit<lfs::lfs_t>,
这将对下游产生连锁反应,要求您随后修改访问这些字段的任何代码。
- 用
write
初始化它们。 - 阅读
assume_init_ref
orassume_init_mut
。