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