File tree 3 files changed +85
-0
lines changed
3 files changed +85
-0
lines changed Original file line number Diff line number Diff line change @@ -152,6 +152,33 @@ impl<T> Box<T> {
152
152
Box ( ptr. cast ( ) . into ( ) )
153
153
}
154
154
155
+ /// Constructs a new `Box` with uninitialized contents, with the memory
156
+ /// being filled with `0` bytes.
157
+ ///
158
+ /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
159
+ /// of this method.
160
+ ///
161
+ /// # Examples
162
+ ///
163
+ /// ```
164
+ /// #![feature(new_uninit)]
165
+ ///
166
+ /// let zero = Box::<u32>::new_zeroed();
167
+ /// let zero = unsafe { zero.assume_init() };
168
+ ///
169
+ /// assert_eq!(*zero, 0)
170
+ /// ```
171
+ ///
172
+ /// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
173
+ #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
174
+ pub fn new_zeroed ( ) -> Box < mem:: MaybeUninit < T > > {
175
+ unsafe {
176
+ let mut uninit = Self :: new_uninit ( ) ;
177
+ ptr:: write_bytes :: < T > ( uninit. as_mut_ptr ( ) , 0 , 1 ) ;
178
+ uninit
179
+ }
180
+ }
181
+
155
182
/// Constructs a new `Pin<Box<T>>`. If `T` does not implement `Unpin`, then
156
183
/// `x` will be pinned in memory and unable to be moved.
157
184
#[ stable( feature = "pin" , since = "1.33.0" ) ]
Original file line number Diff line number Diff line change @@ -361,6 +361,35 @@ impl<T> Rc<T> {
361
361
}
362
362
}
363
363
364
+ /// Constructs a new `Rc` with uninitialized contents, with the memory
365
+ /// being filled with `0` bytes.
366
+ ///
367
+ /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and
368
+ /// incorrect usage of this method.
369
+ ///
370
+ /// # Examples
371
+ ///
372
+ /// ```
373
+ /// #![feature(new_uninit)]
374
+ ///
375
+ /// use std::rc::Rc;
376
+ ///
377
+ /// let zero = Rc::<u32>::new_zeroed();
378
+ /// let zero = unsafe { zero.assume_init() };
379
+ ///
380
+ /// assert_eq!(*zero, 0)
381
+ /// ```
382
+ ///
383
+ /// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
384
+ #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
385
+ pub fn new_zeroed ( ) -> Rc < mem:: MaybeUninit < T > > {
386
+ unsafe {
387
+ let mut uninit = Self :: new_uninit ( ) ;
388
+ ptr:: write_bytes :: < T > ( Rc :: get_mut_unchecked ( & mut uninit) . as_mut_ptr ( ) , 0 , 1 ) ;
389
+ uninit
390
+ }
391
+ }
392
+
364
393
/// Constructs a new `Pin<Rc<T>>`. If `T` does not implement `Unpin`, then
365
394
/// `value` will be pinned in memory and unable to be moved.
366
395
#[ stable( feature = "pin" , since = "1.33.0" ) ]
Original file line number Diff line number Diff line change @@ -341,6 +341,35 @@ impl<T> Arc<T> {
341
341
}
342
342
}
343
343
344
+ /// Constructs a new `Arc` with uninitialized contents, with the memory
345
+ /// being filled with `0` bytes.
346
+ ///
347
+ /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
348
+ /// of this method.
349
+ ///
350
+ /// # Examples
351
+ ///
352
+ /// ```
353
+ /// #![feature(new_uninit)]
354
+ ///
355
+ /// use std::sync::Arc;
356
+ ///
357
+ /// let zero = Arc::<u32>::new_zeroed();
358
+ /// let zero = unsafe { zero.assume_init() };
359
+ ///
360
+ /// assert_eq!(*zero, 0)
361
+ /// ```
362
+ ///
363
+ /// [zeroed]: ../../std/mem/union.MaybeUninit.html#method.zeroed
364
+ #[ unstable( feature = "new_uninit" , issue = "63291" ) ]
365
+ pub fn new_zeroed ( ) -> Arc < mem:: MaybeUninit < T > > {
366
+ unsafe {
367
+ let mut uninit = Self :: new_uninit ( ) ;
368
+ ptr:: write_bytes :: < T > ( Arc :: get_mut_unchecked ( & mut uninit) . as_mut_ptr ( ) , 0 , 1 ) ;
369
+ uninit
370
+ }
371
+ }
372
+
344
373
/// Constructs a new `Pin<Arc<T>>`. If `T` does not implement `Unpin`, then
345
374
/// `data` will be pinned in memory and unable to be moved.
346
375
#[ stable( feature = "pin" , since = "1.33.0" ) ]
You can’t perform that action at this time.
0 commit comments