(U)Ruby Extensions:rb_gc_mark()和实例变量

ram*_*ion 6 c ruby mark-and-sweep ruby-c-extension

我正在编写一个定义类的ruby扩展.如果我Data_Wrap_Struct()用来实现我的回调rb_define_alloc_func(),我是否需要手动标记并释放实例变量?或者这仍然是为我处理的?

mol*_*olf 7

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

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

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