From eb351ec7671cccc3b17bf77b4146ab6cfab7978b Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Thu, 6 Oct 2022 18:55:00 +0200 Subject: [PATCH] Use `ManuallyDrop` instead of `mem::forget` `mem::forget` should usually not be used in unsafe code, as it's a little footgunny. `mem::forget` does a typed move _after_ the type has been moved out of, which is bad, as typed moves assert validity, but types can become invalid once they have been moved out of. In this specific example it's not a soundness problem, but we should promote the better style of using `ManuallyDrop` instead. --- src/vec/vec-into-iter.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vec/vec-into-iter.md b/src/vec/vec-into-iter.md index e98bdc5..a3a3c8c 100644 --- a/src/vec/vec-into-iter.md +++ b/src/vec/vec-into-iter.md @@ -60,13 +60,13 @@ impl IntoIterator for Vec { type Item = T; type IntoIter = IntoIter; fn into_iter(self) -> IntoIter { - // Can't destructure Vec since it's Drop - let ptr = self.ptr; - let cap = self.cap; - let len = self.len; - // Make sure not to drop Vec since that would free the buffer - mem::forget(self); + let vec = ManuallyDrop::new(self); + + // Can't destructure Vec since it's Drop + let ptr = vec.ptr; + let cap = vec.cap; + let len = vec.len; unsafe { IntoIter {