以下代码是否正确?
我应该注意到 miri 没有遇到任何问题。
#![feature(maybe_uninit)]
use std::mem;
const N: usize = 2; // or another number
type T = String; // or any other type
fn main() {
unsafe {
// create an uninitialized array
let t: mem::MaybeUninit<[T; N]> = mem::MaybeUninit::uninitialized();
// convert it to an array of uninitialized values
let mut t: [mem::MaybeUninit<T>; N] = mem::transmute(t);
// initialize the values
t[0].set("Hi".to_string());
t[1].set("there".to_string());
// use the values
println!("{} {}", t[0].get_ref(), t[1].get_ref());
// drop the values
mem::replace(&mut t[0], mem::MaybeUninit::uninitialized()).into_initialized();
mem::replace(&mut t[1], mem::MaybeUninit::uninitialized()).into_initialized();
}
}
我应该注意到 miri 没有遇到任何问题。
MaybeUninit<[MaybeUninit<T>]>
会有什么区别吗? - llogiqMaybeUninit
文档的一部分。在MaybeUninit
的特定情况下,似乎我最初是错误的,我已经更新了我的答案以反映这一点。 - FrxstremMaybeUninit
已经被标记为#[repr(transparent)]
:https://github.com/rust-lang/rust/blob/master/RELEASES.md#libraries-25 - Jack O'Connor