6

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

4

1 回答 1

7

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

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

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

于 2009-06-09T20:34:02.813 回答