Skip to content

Commit c0809ed

Browse files
authored
Rollup merge of rust-lang#73678 - Keno:patch-1, r=LukasKalbertodt
Update Box::from_raw example to generalize better I know very little about rust, so I saw the example here ``` use std::alloc::{alloc, Layout}; unsafe { let ptr = alloc(Layout::new::<i32>()) as *mut i32; *ptr = 5; let x = Box::from_raw(ptr); } ``` and tried to generalize it by writing, ``` let layout = Layout::new::<T>(); let new_obj = unsafe { let ptr = alloc(layout) as *mut T; *ptr = obj; Box::from_raw(ptr) }; ``` for some more complicated `T`, which ended up crashing with SIGSEGV, because it tried to `drop_in_place` the previous object in `ptr` which is of course garbage. I think that changing this example to use `.write` instead would be a good idea to suggest the correct generalization. It is also more consistent with other documentation items in this file, which use `.write`. I also added a comment to explain it, but I'm not too attached to that, and can see it being too verbose in this place.
2 parents 3de07e0 + 0c88dd6 commit c0809ed

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

src/liballoc/boxed.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,10 @@ impl<T: ?Sized> Box<T> {
384384
///
385385
/// unsafe {
386386
/// let ptr = alloc(Layout::new::<i32>()) as *mut i32;
387-
/// *ptr = 5;
387+
/// // In general .write is required to avoid attempting to destruct
388+
/// // the (uninitialized) previous contents of `ptr`, though for this
389+
/// // simple example `*ptr = 5` would have worked as well.
390+
/// ptr.write(5);
388391
/// let x = Box::from_raw(ptr);
389392
/// }
390393
/// ```

0 commit comments

Comments
 (0)