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

时间:2018-01-17 10:35:00

标签: ruby ruby-c-extension

我正在尝试编写一个非常小的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()分配的数组在不再使用时是否会被正确清理?垃圾收集器如何识别对该值的引用?

1 个答案:

答案 0 :(得分:0)

是的,如果您使用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){}

     

静态VALUE t_allocate(VALUE obj){return   Data_Wrap_Struct(OBJ,NULL,t_free,M); }