F#WikiBookのEncapsulating Mutable Stateセクションには、次のコードスニペットがあります。まず可変状態値はいつヒープから解放されますか?
> let incr =
let counter = ref 0
fun() ->
counter := !counter + 1
!counter;;
val incr : (unit -> int)
> incr();;
val it : int = 1
> incr();;
val it : int = 2
> incr();;
val it : int = 3
、それは可変counter
値は毎回incr
が呼び出されるインクリメント、という事実を飲み込むのに十分な簡単なように見えました。
しかし、しばらく考えてみると、counter
がヒープから解放されたときに、またcounter
がインクリメントされる前の以前の値を参照する方法がわかりませんでした。 counter
は、incr
の範囲内にあり、複数の関数呼び出しでどのように存続しますか?
だから、主な質問は以下のとおりです。
counter
は、ヒープから解放されないときは?counter
はメモリリークですか?
はい、でもそれは役に立ちません。 GC環境であっても、メモリリークが発生する可能性があります。つまり、もはや使用されなくなったオブジェクトを誤って保持してしまったときです。 (インスタンスメソッドへの代理人は、例えば 'this'オブジェクトを保持します)。 –
@Dave私はFSIからサンプルを実行していました。それは、FSIを終了するまで、一度は範囲から外れないことを意味しますか? – Sung
はい、FSIでは、これはFSIセッションの生涯にわたってハングします。あなたが 'これを離れる'ことができるようにしたいなら、 'incr'を変更可能にしてください。一般に、FSIセッションは、トップレベルの名前が(シャドウイングのために到達不能になっても)バインドされないため、多くのリークが発生します。 – Brian