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


Rust ManuallyDrop用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 Struct std::mem::ManuallyDrop。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。