本文簡要介紹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 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 Formatter.precision用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function core::ptr::drop_in_place。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。