Ruby C 扩展:我怎么知道我的 C 代码中生成的 ruby VALUE 将被 GC 正确清理



我正在尝试编写一个非常小的C扩展。所以我不想用初始化器、分配器等创建一个完整的 ruby 类。我想做的只是向现有类添加一个静态方法,该方法将运行算法并返回结果。不幸的是,我找到的所有文档都只谈到将 C 结构包装成 VALUE,但这不是我的用例。

我想知道的是:如果我在我的 C 代码中创建一个 ruby 对象(将分配内存(,并且我将其作为函数的结果返回,它会由垃圾收集器正确处理,还是会泄漏?

例:

void Init_my_extension() 
{
  VALUE cFooModule;
  cFooModule = rb_const_get(rb_cObject, rb_intern("Foo"));
  rb_define_singleton_method(cFooModule, "big_calc", method_big_calc, 1);
}
VALUE method_big_calc(VALUE self, VALUE input)
{
  VALUE result;
  result = rb_ary_new();
  return result;
}
当不再使用时,

rb_ary_new()分配的阵列是否会得到适当的清理?垃圾回收器如何知道对此值的引用?

是的,如果您使用 rb_ary_new() ,则可以正确编写干净的内存。

在我看来,您需要回答其他问题。如何创建自己的对象。http://www.onlamp.com/pub/a/onlamp/2004/11/18/extending_ruby.html

首先,您必须创建rb_define_alloc_func(cYouObject,t_allocate);

类似这个

struct stru { char a; };

void t_free(struct stru *a( { }

静态值 t_allocate(值 obj( { 返回 Data_Wrap_Struct(obj,NULL,t_free,m(;}

最新更新