(U)Ruby扩展:rb_gc_mark()和实例变量
-
13-09-2019 - |
题
我正在写一个红宝石扩展,定义一个类。
如果我使用Data_Wrap_Struct()
来实现我的rb_define_alloc_func()
回调,我需要手动标记并释放实例变量?或者是说对我来说还是处理?
解决方案
Ruby的GC将收集在你的Ruby对象的实例变量引用的任何Ruby对象。你不必,也不应该,免费Ruby的实例变量自己(即在扩展与rb_iv_set()
/ rb_iv_get()
访问的任何对象)。
然而,如果包装的 C结构的引用Ruby对象,那么你就必须以纪念那些在要传递到mark
的Data_Wrap_Struct()
回调。
(你将始终有自由的基本结构,以及做任何其他的清理,可能是必要的,如你free
回调关闭文件,插座等。)
不隶属于 StackOverflow