在封装可变状态部分的 F# WikiBook 上,有以下代码片段。
> 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
内存泄漏吗?