生存期間とヒープ
ヒープ 上の値には(Box::leak などによる意図的なリークを除いて)所有者 がいる たとえば、Box<T> は T の値をヒープに配置するが、所有者は Box<T> を保持する変数である
e.g.
下記のコードの場合、Box<Item> の所有者は変数 b
code:rs
{
let b: Box<Item> = Box::new(Item { contents: 42 });
}
所有者が スコープ を抜けて ドロップ すると、ヒープ上の値も同様にドロップされる つまり、ヒープ上のアイテムの 生存期間 は、スタック 上の変数のライフタイムと同じ 所有者自体がヒープ上に存在するケースもあり、この場合も 最終的に誰が 所有 しているか(所有権の連鎖がどこで終わるか) を知ることがが重要 e.g.
code:rs
{
let b: Box<Item> = Box::new(Item { contents: 42 });
let bb: Box<Box<Item>> = Box::new(b); // b がヒープ上に移動する
} // bb がドロップされると、Box<Item> もドロップされ、Item もドロップされる
上記のコードでは、以下のような所有権の連鎖である
1. Item は Box<Item> によって所有される
2. Box<Item> は Box<Box<Item>> によって所有される
3. Box<Box<Item>> はスタック上の変数 bb によって所有される
つまり、b の所有権の連鎖が終わるのはブロックが閉じた時である
所有権の連鎖の終点となるのは、以下の 2 つのいずれかである
1. ローカル変数または関数パラメータ
この場合、その連鎖に含まれるすべてのアイテムの生存期間は スタック上の変数の生存期間と同じ になり、連鎖内のすべてのアイテムはドロップされる
2. static 変数
この場合、その連鎖に含まれるすべてのアイテムの生存期間は 'static になり、連鎖内のすべてのアイテムはドロップされない
以上を踏まえると、ヒープ上のアイテムの生存期間は、基本的にスタックの生存期間と同じである