本文簡要介紹rust語言中 Struct std::mem::ManuallyDrop
的用法。
用法
#[repr(transparent)]pub struct ManuallyDrop<T> where T: ?Sized, { /* fields omitted */ }
禁止編譯器自動調用 T
的析構函數的包裝器。這個包裝器是 0 成本的。
ManuallyDrop<T>
受到相同的布局優化T
。結果,它有沒有效果基於編譯器對其內容所做的假設。例如,初始化一個ManuallyDrop<&mut T>
和std::mem::zeroed是未定義的行為。如果需要處理未初始化的數據,請使用std::mem::MaybeUninit反而。
請注意,訪問 ManuallyDrop<T>
中的值是安全的。這意味著不得通過公共安全 API 公開其內容已被刪除的 ManuallyDrop<T>
。相應地,ManuallyDrop::drop
是不安全的。
ManuallyDrop
和刪除訂單。
Rust 有一個明確定義的 drop order 值。要確保按特定順序刪除字段或局部變量,請對聲明重新排序,以使隱式刪除順序正確。
可以使用ManuallyDrop
來控製放置順序,但這需要不安全的代碼,並且在存在展開的情況下很難正確執行。
例如,如果您想確保將特定字段放在其他字段之後,請將其設置為結構的最後一個字段:
struct Context;
struct Widget {
children: Vec<Widget>,
// `context` will be dropped after `children`.
// Rust guarantees that fields are dropped in the order of declaration.
context: Context,
}
相關用法
- Rust ManuallyDrop.into_inner用法及代碼示例
- Rust ManuallyDrop.new用法及代碼示例
- Rust MaybeUninit.assume_init_mut用法及代碼示例
- Rust MaybeUninit.as_ptr用法及代碼示例
- Rust MaybeUninit.write_slice用法及代碼示例
- Rust MaybeUninit.assume_init_ref用法及代碼示例
- Rust MaybeUninit.zeroed用法及代碼示例
- Rust MaybeUninit.write_slice_cloned用法及代碼示例
- Rust MaybeUninit.assume_init用法及代碼示例
- Rust MaybeUninit.write用法及代碼示例
- Rust MaybeUninit用法及代碼示例
- Rust MaybeUninit.as_mut_ptr用法及代碼示例
- Rust MaybeUninit.array_assume_init用法及代碼示例
- Rust Map用法及代碼示例
- Rust MaybeUninit.uninit用法及代碼示例
- Rust MaybeUninit.new用法及代碼示例
- Rust MaybeUninit.uninit_array用法及代碼示例
- Rust MaybeUninit.assume_init_read用法及代碼示例
- Rust Mutex.new用法及代碼示例
- Rust MetadataExt.st_ctime_nsec用法及代碼示例
- Rust MetadataExt.mtime_nsec用法及代碼示例
- Rust MetadataExt.nlink用法及代碼示例
- Rust MulAssign.mul_assign用法及代碼示例
- Rust Mutex.get_mut用法及代碼示例
- Rust MetadataExt.st_atime用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Struct std::mem::ManuallyDrop。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。