parent
4a66a704b2
commit
9063b64cff
1 changed files with 6 additions and 4 deletions
|
@ -128,10 +128,6 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
|
||||||
|
|
||||||
let iter = mem::replace(&mut self.iter, (&mut []).iter());
|
let iter = mem::replace(&mut self.iter, (&mut []).iter());
|
||||||
let drop_len = iter.len();
|
let drop_len = iter.len();
|
||||||
let drop_ptr = iter.as_slice().as_ptr();
|
|
||||||
|
|
||||||
// forget iter so there's no aliasing reference
|
|
||||||
drop(iter);
|
|
||||||
|
|
||||||
let mut vec = self.vec;
|
let mut vec = self.vec;
|
||||||
|
|
||||||
|
@ -155,6 +151,12 @@ impl<T, A: Allocator> Drop for Drain<'_, T, A> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// as_slice() must only be called when iter.len() is > 0 because
|
||||||
|
// vec::Splice modifies vec::Drain fields and may grow the vec which would invalidate
|
||||||
|
// the iterator's internal pointers. Creating a reference to deallocated memory
|
||||||
|
// is invalid even when it is zero-length
|
||||||
|
let drop_ptr = iter.as_slice().as_ptr();
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
// drop_ptr comes from a slice::Iter which only gives us a &[T] but for drop_in_place
|
// drop_ptr comes from a slice::Iter which only gives us a &[T] but for drop_in_place
|
||||||
// a pointer with mutable provenance is necessary. Therefore we must reconstruct
|
// a pointer with mutable provenance is necessary. Therefore we must reconstruct
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue