OCaml 是否复制了自定义块?

2024-03-05

想象一下,我有一个名为 libcat 的 C 库,用于与我的毛茸茸的猫进行交互。因此,我正在为 OCaml 编写绑定来简化与 fluffy 的交互。

module type CAT = sig 
   type cat
   val find : ... -> cat
   val feed : cat -> unit
   ...
end ;;
module Cat : CAT = ...

libcat 中已经内置了相当多的内存管理功能,比如缓存、释放被破坏的玩具,甚至可能还有一个用于清空垃圾的有限范围的垃圾收集器。然而,总体而言,libcat 要求用户明确释放未使用的资源,例如丢失的玩具。

我为 Cat.find 编写了一个 C 存根,它使用 libcat 的 cat_find 例程查找并分配 cat,但随后将结果指向 cat 的指针存储在使用 caml_alloc_custom 创建的自定义块中。

我已将 Finalize 方法添加到传递到 caml_alloc_custom 的 custom_operations 结构中。至关重要的是,我用这个终结方法释放了猫,因为我厌倦了在我接听电话异常时她在门上抓挠。

我现在担心,如果 OCaml 复制了 Cat.cat 类型的自定义块,那么 OCaml 的垃圾收集器可能会在我们还在玩的时候释放 fluffy。例如 :

let fluffy = Cat.find ;;
fluffy.yodel ;;
let meow = fluffy ;;
...
meow.feed ;;

我们必须假设...将在最后一次显式引用 fluffy 之后触发 OCaML 的垃圾收集器,例如打破盘子。这个垃圾收集事件会调用 fluffy 的 Finalize 方法并释放她吗?或者meow会简单地引用fluffy原来的自定义块,从而阻止fluffy被释放?

我想在这种情况下 fluffy 不会被释放,否则 OCaml 肯定会在 custom_operations 结构中要求重复的方法,但我觉得最好问一下。如果 fluffy 实际上可能被释放,我可以通过仅让 OCaml 通过引用来处理她来防止这种情况吗?大致 :

  type cat_name = real_cat ref
  type real_cat

自定义块本身,即从caml_alloc_custom,是 Caml 堆的一部分,可以像任何其他对象一样移动。 Caml将自定义块的内容视为不透明,甚至不知道它是否包含指针,因此它不会触及这些数据结构。

当你写的时候let meow = fluffy,没有进行任何复制:您只是为同一个对象指定一个新名称。 Caml 永远不会复制自定义块;如果你想要的话,你必须提供一个copy_cat你的图书馆里很原始。

¹ Only the minor garbage collector and the compactor actually move blocks around, the major gc doesn't. But that's not something you should rely on.

² Or Fortran, or whatever other language your program or library uses.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OCaml 是否复制了自定义块? 的相关文章

  • UIViewController 弹出时未释放

    我有一个表视图 当选择一个单元格时 它将视图控制器推送到导航堆栈上 SAPostTableViewController postViewController SAPostTableViewController alloc initWithN
  • ListView 与 getView() 由于不断的 GC 而变得缓慢?

    我的应用程序中有一个 ListView 并且我已经重写了 getView 方法 因此我可以根据行的文本更改行的 ImageView src 问题是 我注意到 ListView 滚动滞后 当我检查 DDMS 时 似乎每次滚动 ListView
  • .Net 与 Java 垃圾收集器

    有谁知道 Java 和 Net 垃圾收集器之间的主要区别 网上搜索并没有透露太多信息 这是一个测试中出现的问题 区别在于 CLR Net GC 和 JVM GC 之间 而不是语言本身 两者都可能发生变化 并且其行为规范宽松 允许在不影响程序
  • 释放指针向量,但内存仍在使用中

    我不知道下面的代码有什么问题 我正在删除所有指针 但是当我使用 top 命令查看内存时 我可以看到仍然有大量内存分配给程序 我在这里缺少一些东西来释放内存吗 include
  • 销毁与解除分配

    在 Accelerated C 第 11 章中 作者提出了一个使用数组模拟 std vector 行为的 Vector 类 他们使用分配器类来处理内存管理 的作用uncreate函数是销毁数组的每个元素并释放为数组分配的空间 templat
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • 如何强制操作系统收回内存? (C++)

    在我的 C 代码中 我分配了大量内存来创建树 然后在每个节点中使用 删除 来释放内存 删除所有内容后 我检查操作系统使用的内存量 发现内存未释放 这是预期的 因为该进程不会立即将内存返回给操作系统 因为它仍然可能会再次使用它 问题是 我在删
  • OCaml 中的线性类型

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • C# 和 .Net 垃圾收集器性能

    我正在尝试用 C 和 NET 制作游戏 并且计划实现更新游戏世界中游戏对象的消息 这些消息将是 C 引用对象 我想要这种方法 因为如果我希望游戏是多人游戏 那么通过网络发送它们会更容易 但是如果我有很多消息 对于垃圾收集器来说不是压力很大吗
  • 这个作用域/闭包什么时候在 javaScript 中被垃圾回收?

    我正在做一门课程 该课程正在讨论范围 闭包并简要提到垃圾收集 课程中提出一个问题 范围保持多久 答案是 直到 不再有任何提及它 是的 所以我们基本上说的是 是的 闭包有点像对隐藏范围对象的引用 所以只要有一些函数仍然有一个闭包 范围 该范围
  • 为什么地址清理器对 bss 全局溢出不起作用?

    我做了什么 Test1 1 include
  • Java HashMap 与 ArrayList 相比的内存开销

    我想知道java HashMap与ArrayList相比的内存开销是多少 Update 我想提高搜索一大包 600 万以上 相同对象的特定值的速度 因此 我正在考虑使用一个或多个HashMap来代替ArrayList 但我想知道 HashM
  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • numpy.ndarray 对象不被垃圾回收

    在尝试微调某些 C C 函数的 Python 绑定中的一些内存泄漏时 我发现了一些与 Numpy 数组的垃圾收集相关的奇怪行为 为了更好地解释这种行为 我创建了几个简化的案例 该代码是使用memory profiler 其输出紧随其后 当涉
  • 在 OCaml 自定义顶层设置提示

    在 OCaml 自定义顶层中 有没有一种方法可以通过编程方式设置提示 到别的东西 我希望能够更改它以响应用户的最后一个自定义功能 有点像bash你如何设置PS1 我什至找不到 directive 来更改它 谢谢 在 toplevel top
  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • .net中连续内存存储的误解?

    http msdn microsoft com en us library ms379570 v vs 80 aspx http msdn microsoft com en us library ms379570 v vs 80 aspx
  • XNA:Unload() 的意义是什么?

    XNA 游戏有一个Unload 方法 其中内容应该被卸载 但这有什么意义呢 如果所有内容都被卸载 那么游戏一定会退出 在这种情况下 无论如何 所有内容都会被垃圾收集 对吗 据我了解 它对于任何标准用途都没有用 因为正如您所说 垃圾收集器为您
  • 一旦组件被销毁,在 initComponent 函数中创建的存储是否会发生内存泄漏,或者这些存储是否会被垃圾收集?

    这是从另一个问题中衍生出来的一个问题 在 ExtJS 4 中具有相同视图并多次存储的最佳实践 https stackoverflow com questions 27333787 best practice to have the same
  • OCaml 2 和 3 之间的差异

    我有兴趣学习这门语言 但似乎有关该主题的教程和书籍很少 我只找到一本关于这个主题的合适的书 用 Objective Caml 这绝对是完美的 但问题是它是基于 2 04 版本的 所以我唯一关心的是使用这本书 对于 OCaml 3 x 是否会

随机推荐