Rollup merge of #62634 - llogiq:uninit-array-docs, r=RalfJung
Less unsafe in the array example of MaybeUninit docs I believe this is an acceptable way to initialize elements of `[MaybeUninit<T>; _]` arrays. Miri agrees. Conceptually, we are working at the array level, above the `MaybeUninit`, and as we are replacing it wholesale, this should pose no problem to soundness. And the code is easier to read. r? @RalfJung
This commit is contained in:
commit
caf10b5ffe
1 changed files with 7 additions and 5 deletions
|
@ -112,7 +112,6 @@ use crate::mem::ManuallyDrop;
|
|||
///
|
||||
/// ```
|
||||
/// use std::mem::{self, MaybeUninit};
|
||||
/// use std::ptr;
|
||||
///
|
||||
/// let data = {
|
||||
/// // Create an uninitialized array of `MaybeUninit`. The `assume_init` is
|
||||
|
@ -122,10 +121,13 @@ use crate::mem::ManuallyDrop;
|
|||
/// MaybeUninit::uninit().assume_init()
|
||||
/// };
|
||||
///
|
||||
/// // Dropping a `MaybeUninit` does nothing, so if there is a panic during this loop,
|
||||
/// // we have a memory leak, but there is no memory safety issue.
|
||||
/// // Dropping a `MaybeUninit` does nothing. Thus using raw pointer
|
||||
/// // assignment instead of `ptr::write` does not cause the old
|
||||
/// // uninitialized value to be dropped. Also if there is a panic during
|
||||
/// // this loop, we have a memory leak, but there is no memory safety
|
||||
/// // issue.
|
||||
/// for elem in &mut data[..] {
|
||||
/// unsafe { ptr::write(elem.as_mut_ptr(), vec![42]); }
|
||||
/// *elem = MaybeUninit::new(vec![42]);
|
||||
/// }
|
||||
///
|
||||
/// // Everything is initialized. Transmute the array to the
|
||||
|
@ -151,7 +153,7 @@ use crate::mem::ManuallyDrop;
|
|||
/// let mut data_len: usize = 0;
|
||||
///
|
||||
/// for elem in &mut data[0..500] {
|
||||
/// unsafe { ptr::write(elem.as_mut_ptr(), String::from("hello")); }
|
||||
/// *elem = MaybeUninit::new(String::from("hello"));
|
||||
/// data_len += 1;
|
||||
/// }
|
||||
///
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue