当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust drop_in_place用法及代码示例


本文简要介绍rust语言中 Function core::ptr::drop_in_place 的用法。

用法

pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T)

执行指向值的析构函数(如果有)。

这在语义上等同于调用 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-lang.org大神的英文原创作品 Function core::ptr::drop_in_place。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。