假设我有一个功能
let rec f x =
let a = (* build a huge list, possibly used f on smaller input again here *) in
let b = (* build a huge list, possibly used f on smaller input again too *) in
List.append a b
我的问题是,在调用f
后a
和b
被释放了吗?我的程序正在耗尽我的记忆,我怀疑这是否是原因。
答案 0 :(得分:2)
在f
返回其值后,无法访问变量a
和b
。因此a
的值最终将被垃圾收集。对于List.append
最明显的实现,b
的值构成了函数结果的一部分。因此,在无法再访问此结果之前,不会对其进行垃圾回收。
如果您有内存泄漏,则需要查看整个计算可访问的位置。一个例子是一个大的全球表。
答案 1 :(得分:1)
请注意,如果您使用的是非常大的数据结构,那么列表可能不是一个好选择,尤其是使用concat
连接列表的效率非常低。