我正在尝试编写一个非常小的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(;}