Расширение Ruby C: Как узнать, что сгенерированное в моем коде C значение ruby будет корректно очищено GC?
Я пытаюсь написать действительно маленькое расширение Си. Поэтому я не хочу создавать целый класс ruby с инициализатором, распределителем и так далее. Все, что я хочу сделать, это добавить статический метод к существующему классу, метод, который будет запускать алгоритм и возвращать результат. К сожалению, вся документация, которую я нахожу, говорит только об обёртывании структуры C в VALUE, но это не мой вариант использования.
Что я хочу знать: если я создам объект ruby (который будет выделять память) внутри моего кода C, и что я верну его как результат моей функции, будет ли он должным образом позаботиться сборщиком мусора, или это так? собирается течь?
Пример:
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 ответ
Да, Вы правильно очищаете память, если используете 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) {}
static VALUE t_allocate (VALUE obj) {return Data_Wrap_Struct (obj, NULL, t_free, m); }