c - (U) Ruby 扩展 : rb_gc_mark() and instance variables

标签 c ruby ruby-c-extension mark-and-sweep

我正在编写定义类的 ruby​​ 扩展。 如果我使用 Data_Wrap_Struct() 来实现我对 rb_define_alloc_func() 的回调,我是否需要手动标记和释放实例变量?还是仍然为我处理?

最佳答案

Ruby 的 GC 将收集在您的 Ruby 对象的实例变量中引用的所有 Ruby 对象。您不必也不应该自己释放 Ruby 实例变量(即在您的扩展中使用 rb_iv_set()/rb_iv_get() 访问的任何对象)。

但是,如果包装的 C struct 引用 Ruby 对象,那么您必须在传递给 Data_Wrap_Struct() 的 mark 回调中标记这些对象

(并且您将始终必须释放底层结构,并在您的 free 回调中执行任何其他可能需要的清理,例如关闭文件、套接字等。)

关于c - (U) Ruby 扩展 : rb_gc_mark() and instance variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/970525/

相关文章:

ruby-on-rails - update_all 清除变量中的数组

c - 互斥线程 - 代码似乎无法正确退出

c++ - 如何将 2 位从一个 int 复制到另一个?

ruby - 尝试循环遍历 Vagrant 框的哈希,失败

c - Ruby C API `defined? SomeConstant` 等效?

ruby - 庭院和 C 扩展

c - 我在这个 C 扩展中引用实例的方式有问题吗?

c - 将结构声明为指针,可能吗?

c - 使用 ANSI C 的匿名结构

ruby-on-rails - 不同命名空间中的关系