動的メモリ上の型に見られる leak 系メソッドについて。

主な用途

これらのメソッドは動的に取得した領域を、プログラム終了まで固定領域として使用し続けるのに用いる。参照がまだ生きている点を除けば、これは名前の由来のメモリリークと似た状況である (一応、戻そうと思えば Box::from_raw 関数などで再び解放が可能になる)。

メソッド一覧

以下は std クレート内の該当メソッドの一覧である。

どのメソッドも self を消費して可変参照を戻す。

Box<T, A> fn leak<'a>(self) -> &'a mut T where A: 'a
Vec<T, A> fn leak<'a>(self) -> &'a mut [T] where A: 'a
String fn leak<'a>(self) -> &'a mut str
OsString fn leak<'a>(self) -> &'a mut OsStr
PathBuf fn leak<'a>(self) -> &'a mut Path

サンプル

以下では、型パラメタ T に対応する既定値への参照を取得している。


se std::any::{Any, TypeId};
use std::collections::BTreeMap;
use std::sync::Mutex;

pub fn default_ref<T>() -> &'static T
where
    T: Any + Default + Send + Sync,
{
    static MAP: Mutex<BTreeMap<TypeId, &'static (dyn Any + Send + Sync)>> =
        Mutex::new(BTreeMap::new());

    MAP.lock()
        .unwrap()
        .entry(TypeId::of::<T>())
        .or_insert_with(|| Box::leak(Box::new(T::default())))
        .downcast_ref()
        .unwrap()
}