【问题标题】:Shadowing and garbage collecting in F#F# 中的阴影和垃圾收集
【发布时间】:2016-02-16 20:15:20
【问题描述】:

这是我第一次遇到阴影,似乎没有针对我的问题的资源。

如果我执行以下操作

let x = a list
let x = another list 

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

我假设(根据我的导师所说)第一个列表不会自动销毁,只是在范围结束时收集垃圾。

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

【问题讨论】:

  • 你能通过在线链接识别课程吗?如果是这样,那么我们中的一些人会根据教师试图教授的概念给出更好的答案。
  • Guy Coder,它只是一个关于函数式编程范式的课程。讨论从上面的代码开始,我问为什么会发生这种情况,讲师解释了阴影,并且阴影很可能没有定义特殊的垃圾收集,所以我认为它是范围的结束。上面的代码是教练在声明一个新变量时不小心复制粘贴的,当然它仍然有效。
  • end of scope 是什么意思。我有一个想法,但我的想法可能不是你想的那样。
  • 所以上面的代码是在main中声明的,所以main的结束也就是程序的结束,数据会被删除。
  • 它不应该被垃圾回收的原因是,如果你曾经进行递归问题解决,当你展开堆栈回到堆栈上的值回到范围内的点时,你可以分支该状态进入更深入的搜索。

标签: f# garbage-collection shadowing


【解决方案1】:

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

然而,符合垃圾回收条件并不意味着该对象在代码中的任何特定点被回收,尤其不是“在范围的末尾”。在作用域结束时清理事物的想法与 C++* 中的析构函数有关,GC 在 .NET 中根本不像那样工作。 GC 并发运行,可能会或可能不会在任何时间点回收任何合格的东西。这甚至可能在代码退出当前范围之前或之后,或never 之前发生。 GC 甚至不关心您是否在范围内有一个引用对象的变量,如果您不使用它,它就不算数(请参阅活性分析)。

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

【讨论】:

    【解决方案2】:

    考虑以下几点:

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

    现在即使您正在关注x,您仍然可以访问list1。这只是一个示例——通常,不可能静态地识别对特定值的所有引用(别名)。相反,垃圾收集器会在运行时识别它们。

    显然,在这种特定情况下,您可能会建议获得一些特殊支持是有意义的,而且确实可能​​存在——我不知道自己。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多