【问题标题】:F# - Do ref cells need to be deleted explicitly?F# - 是否需要明确删除参考单元格?
【发布时间】:2017-01-31 01:03:39
【问题描述】:

在引用堆上的数据的意义上,引用单元是否类似于指针,并且需要显式删除?我在网上看到的所有示例都没有明确的删除调用。

【问题讨论】:

  • CLR 是一个垃圾收集环境。你不需要“删除”任何东西。
  • ... 但有时您喜欢处理文件和连接等资源。但对于纯内存资源的 ref 单元而言,情况并非如此。

标签: pointers f# heap-memory delete-operator ref


【解决方案1】:

您将如何明确删除它们?

此外,如果您查看 source code,您会发现 ref 单元类型只是可变字段上的不可变包装,:=! 运算符是 simply getter/setter calls

您可以很容易地以类似的方式自己实现 ref:

type Ref<'a> = { mutable value: 'a }
let (:=) (r: Ref<_>) v = r.value <- v
let (!) (r: Ref<_>) = r.value

【讨论】:

    【解决方案2】:

    在引用堆上的数据的意义上,引用单元是否类似于指针,并且需要显式删除?

    没有。 F# 在 CLR 上运行,CLR 通过垃圾收集器自动管理内存。内存资源,即使是使用堆的内存资源,也不需要开发者显式清理,事实上,没有机制可以显式删除特定对象。

    相反,当不再有对它的引用时,引用单元格将有资格进行垃圾回收。之后的某个时间,它会被 GC 自动清理掉。

    对于您在 F# 中生成的大多数类型也是如此,例如记录、可区分联合、类等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2011-08-27
      • 2021-01-08
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多