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 是否复制了自定义块? 的相关文章

  • iOS 低内存崩溃,但内存使用率非常低

    这已经困扰我很长时间了 我的应用程序运行占用大约 2 74MB 内存 没关系 但当它创建 UIWebView 时 它会增加到大约 5 87MB 并继续崩溃 这些是在我的第一代 iPad 上运行时仪器中的实时字节下给出的值 我找不到崩溃日志
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • PostgreSQL安装错误——无法分配内存

    我正在尝试从 sqlite3 切换到 PostgreSQL 以在 Rails 中进行开发 这样我就不会遇到任何 heroku 问题 我遵循了heroku和链接到的Railscast上给出的建议 但是在brew安装postgresql后遇到了
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • Lua表在内存中是如何处理的?

    lua如何处理表的增长 是否相当于ArrayList在Java中 IE 需要连续的内存空间 并且当它变得大于已经分配的空间时 内部数组被复制到另一个内存空间 有什么聪明的方法来引导吗 我的问题是 表是如何存储在内存中的 我不是问如何在 Lu
  • ocaml 命令行找不到“topfind”

    我已经安装了opam run opam init run opam switch 4 06 0这创造了一个4 06 0里面的目录 opam 运行 评估opam confing env 出口 OCAML TOPLEVEL PATH as op
  • c++/cli 终结器中免费 GCHandle 的最佳实践

    我在 c 中有一些函数 我会在 net 应用程序中使用它 为此 我用 C cli 编写了一个包装器类 C 接口中有一个回调函数 并将其包装在 net 委托中 但是我应该如何释放回调 gcHandle 的非托管资源呢 是否允许在终结器中从 G
  • malloc :匿名映射和魔法区域

    我只是在摆弄内存映射 想查看用户空间虚拟内存区域映射 写了一些像这样的行 char ptr NULL printf Allocating 300KB n ptr malloc 300 1024 printf Allocated at p s
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • 替代 __del__ 来获得最终结果并终止类中的进程?

    这个虚拟类类似于我当前的项目 class EndProcess object def init self self Q multiprocessing Queue self p1 multiprocessing Process target
  • “calloc”不会自动消耗 RAM 中的内存

    根据这个问题的回答 malloc 和 calloc 之间的区别 https stackoverflow com questions 1538420 difference between malloc and calloc answer 15
  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • 在 Postgres 中为特定查询设置 work_mem

    我正在使用一个委托给 JDBC 驱动程序的库PostgreSQL 而且有些查询非常复杂 需要更多内存 我不想设置work mem对于所有查询来说都是大的 只是这个子集 问题是执行以下代码会导致错误 pseudo code for what
  • Java GC 中的压缩是什么?

    I read http www cubrid org blog tags Garbage 20Collection http www cubrid org blog tags Garbage 20Collection 文章提供了 Java
  • ASP MVC:何时调用 IController Dispose()?

    我正在对我的一个较大的 MVC 应用程序进行大规模重构 速度调整 它已经部署到生产环境几个月了 我开始在连接池中等待连接超时 我已将问题追溯到连接未正确处理的情况 鉴于此 我对我的基本控制器进行了以下更改 public class MyBa
  • 检查 ocaml 中可变列表是否有循环?

    我正在尝试编写一个函数来测试 Ocaml 中的可变列表是否包含循环 即 具有对其自身的引用并连续重复 我的列表定义为type a m list Nil Cons of a a m list ref 到目前为止 我有 let is cycli
  • NSAutoreleasePool。什么时候适合创建新的自动释放池?

    在 iOS CocoaTouch 上 我经常看到在方法中创建 NSAutoreleasePool 新实例的代码 我最近在 NSOperation 中看到了一个 设置 NSAutoreleasePool 新实例的基本规则是什么 为什么这比简单
  • Bison/Flex 中哪里可以释放内存?

    我使用 Bison 和 Flex 的时间或多或少有 1 个月 所以如果我没有看到明显的东西 但我不认为是 我很抱歉 我在使用 Flex Bison 释放内存时遇到问题 我的代码如下所示 parser l DATE yylval str st
  • 垃圾收集最佳实践

    如果您要从显示列表中删除某个 MovieClip 并且该 MovieClip 又具有具有自己的事件侦听器的子 MovieClip 则是否有必要从子 MovieClip 中删除所有侦听器 或者只是直接从显示列表中删除的父级 MovieClip
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts

随机推荐