我正在编写定义类的 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/