本文简要介绍rust语言中 Function std::ptr::drop_in_place
的用法。
用法
pub unsafe fn drop_in_place<T>(to_drop: *mut T) where T: ?Sized,
执行指向值的析构函数(如果有)。
这在语义上等同于调用 ptr::read
并丢弃结果,但具有以下优点:
-
这是必需的使用
drop_in_place
删除未调整大小的类型(例如特征对象),因为它们无法读取到堆栈上并正常删除。 -
当删除手动分配的内存时(例如,在
Box
/Rc
/Vec
的实现中),优化器在ptr::read
上执行此操作更友好,因为编译器不需要证明它是正确的删除副本。 -
当
T
不是repr(packed)
时,它可用于删除pinned 数据(固定数据在删除之前不得移动)。
未对齐的值不能原地放置,必须先使用 ptr::read_unaligned
将它们复制到对齐的位置。对于打包结构,此移动由编译器自动完成。这意味着打包结构的字段不会就地删除。
安全性
如果违反以下任何条件,则行为未定义:
-
对于读取和写入,
to_drop
必须为 valid。 -
to_drop
必须正确对齐。 -
to_drop
指向的值必须对删除有效,这可能意味着它必须支持其他不变量 - 这是type-dependent。
此外,如果 T
不是 Copy
,则在调用 drop_in_place
后使用指向的值可能会导致未定义的行为。请注意,*to_drop = foo
算作一次使用,因为它会导致该值再次被删除。 write()
可用于覆盖数据而不会导致数据被丢弃。
请注意,即使 T
的大小为 0
,指针也必须非空且正确对齐。
例子
从向量中手动删除最后一项:
use std::ptr;
use std::rc::Rc;
let last = Rc::new(1);
let weak = Rc::downgrade(&last);
let mut v = vec![Rc::new(0), last];
unsafe {
// Get a raw pointer to the last element in `v`.
let ptr = &mut v[1] as *mut _;
// Shorten `v` to prevent the last item from being dropped. We do that first,
// to prevent issues if the `drop_in_place` below panics.
v.set_len(1);
// Without a call `drop_in_place`, the last item would never be dropped,
// and the memory it manages would be leaked.
ptr::drop_in_place(ptr);
}
assert_eq!(v, &[0.into()]);
// Ensure that the last item was dropped.
assert!(weak.upgrade().is_none());
相关用法
- Rust drop_in_place用法及代码示例
- Rust drop用法及代码示例
- Rust debug_assert用法及代码示例
- Rust default用法及代码示例
- Rust decode_utf16用法及代码示例
- Rust debug_assert_eq用法及代码示例
- Rust debug_assert_ne用法及代码示例
- Rust debug_assert_matches用法及代码示例
- Rust discriminant用法及代码示例
- Rust dbg用法及代码示例
- Rust UdpSocket.set_multicast_loop_v6用法及代码示例
- Rust i64.overflowing_add_unsigned用法及代码示例
- Rust Box.downcast用法及代码示例
- Rust BTreeMap.last_key_value用法及代码示例
- Rust str.make_ascii_uppercase用法及代码示例
- Rust u128.checked_pow用法及代码示例
- Rust usize.wrapping_mul用法及代码示例
- Rust AtomicU8.fetch_sub用法及代码示例
- Rust PanicInfo.payload用法及代码示例
- Rust MaybeUninit.assume_init_mut用法及代码示例
- Rust String.try_reserve用法及代码示例
- Rust Mutex.new用法及代码示例
- Rust f32.exp用法及代码示例
- Rust Result.unwrap_or_else用法及代码示例
- Rust slice.sort_unstable_by_key用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::ptr::drop_in_place。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。