當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。