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
メモリリークじゃない?