無制限のライフタイム
アンセーフなコードはときに、参照やライフタイムを何も無いところから生み出したりします。
そのようなライフタイムは、無制限 なライフタイムとして世界に登場します。
最もよくあるのは、生ポインタの参照外しをし、無制限のライフタイムを持つ参照を作り出すというケースです。
このライフタイムは、そのコンテキストが必要とするだけ大きくなります。そしてこれは 'static
よりも強力なしくみです。
&'static &'a T
は型チェックをパスしませんが、無制限のライフタイムを使うと必要に応じて &'a &'a T
となるからです。
しかし、ほとんどの意図と目的においては、無制限のライフタイムを 'static
と解釈できます。
参照が 'static
であることはまずありえないので、これはおそらく間違っていると言えるでしょう。
おもに transmute
と transmute_copy
とがこの状況を作り出します。
できるだけ速く、とくに関数の境界では、無制限のライフタイムに制限をつけるように気をつけて下さい。
関数の入力から導出されない出力のライフタイムは無制限となります。例えば、
fn get_str<'a>() -> &'a str;
このコードは無制限のライフタイムを持った &str
を生成します。
無制限のライフタイムを避ける最も簡単な方法は、関数境界でライフタイムを省略することです。
出力ライフタイムが省略された場合、入力ライフタイムで制限されなくてはいけません。
もちろん、間違ったライフタイムで制限されるかもしれませんが、たいていの場合は、メモリ安全性が侵されるのではなく、コンパイルエラーにつながります。
関数内部でライフタイムを制限することは、エラーを生みやすくなります。 ライフタイムを制限する安全で簡単な方法は、制限つきライフタイムの関数から返される値を使うことです。 しかし、これができない場合は、その参照を特定のライフタイムがついた場所に置くと良いでしょう。 残念ながら、関数内のすべてのライフタイムに名前をつけるのは不可能です。