Vec IntoIter: Drop using raw slice
Update Vec drop with a comment to explain why we want to use a raw slice, and extend this pattern to also include the Vec's IntoIter.
This commit is contained in:
parent
7612ad7797
commit
f654daf3a6
@ -2379,6 +2379,8 @@ unsafe impl<#[may_dangle] T> Drop for Vec<T> {
|
|||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
// use drop for [T]
|
// use drop for [T]
|
||||||
|
// use a raw slice to refer to the elements of the vector as weakest necessary type;
|
||||||
|
// could avoid questions of validity in certain cases
|
||||||
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
|
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
|
||||||
}
|
}
|
||||||
// RawVec handles deallocation
|
// RawVec handles deallocation
|
||||||
@ -2596,7 +2598,11 @@ pub fn as_slice(&self) -> &[T] {
|
|||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")]
|
#[stable(feature = "vec_into_iter_as_slice", since = "1.15.0")]
|
||||||
pub fn as_mut_slice(&mut self) -> &mut [T] {
|
pub fn as_mut_slice(&mut self) -> &mut [T] {
|
||||||
unsafe { slice::from_raw_parts_mut(self.ptr as *mut T, self.len()) }
|
unsafe { &mut *self.as_raw_mut_slice() }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_raw_mut_slice(&mut self) -> *mut [T] {
|
||||||
|
ptr::slice_from_raw_parts_mut(self.ptr as *mut T, self.len())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2708,7 +2714,7 @@ fn drop(&mut self) {
|
|||||||
let guard = DropGuard(self);
|
let guard = DropGuard(self);
|
||||||
// destroy the remaining elements
|
// destroy the remaining elements
|
||||||
unsafe {
|
unsafe {
|
||||||
ptr::drop_in_place(guard.0.as_mut_slice());
|
ptr::drop_in_place(guard.0.as_raw_mut_slice());
|
||||||
}
|
}
|
||||||
// now `guard` will be dropped and do the rest
|
// now `guard` will be dropped and do the rest
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user