F#中的阴影和垃圾收集

时间:2016-02-16 20:15:20

标签: f# garbage-collection shadowing

这是我第一次遇到阴影,而且似乎并不是我问题所特有的资源。

如果我执行以下操作

let x = a list
let x = another list 

然后x将保存第二个列表的内容。

我假设(基于我的导师所说的)第一个列表不会自动销毁,只是在范围的末尾收集垃圾。

我的问题是为什么? 一旦不可变被遮蔽,为什么我们不会自动删除第一个列表?这会让我认为数据仍然可以以某种方式被访问。如果是这样,怎么样?

2 个答案:

答案 0 :(得分:5)

假设x是对“列表”的唯一引用,那么是的,在您的代码示例中,“列表”符合垃圾回收的条件。

有资格进行垃圾收集并不意味着该对象在代码中的任何特定点被回收,尤其不是“在范围的末尾”。在范围结束时清理事物的想法与C ++ *中的析构函数有关,GC在.NET中根本不起作用。 GC同时运行,可能会或可能不会在任何时间点回收任何合格的东西。即使在代码退出当前范围之前,或之后,或never,也可能发生这种情况。 GC甚至不关心你是否有一个引用对象的范围变量,如果你没有使用它,它就不计算(参见活跃度分析)。

* F#中有类似的机制,但是:请参阅use bindings

答案 1 :(得分:2)

请考虑以下事项:

let x = list1
let y = x
let x = list2

现在,即使您正在隐藏x,您仍然可以访问list1。这只是一个示例 - 通常,不可能将所有引用(别名)静态标识为特定值。而是垃圾收集器在运行时识别它们。

显然,在这个具体案例中你可能会建议有一些特别的支持是有道理的,事实上也许是 - 我不了解自己。