Вопрос

Я пишу расширение ruby, которое определяет класс.Если я использую Data_Wrap_Struct() чтобы реализовать мой обратный вызов для rb_define_alloc_func(), нужно ли мне вручную отмечать и освобождать переменные экземпляра?Или это все еще решается за меня?

Это было полезно?

Решение

GC Ruby соберет все объекты Ruby, на которые есть ссылки в переменных экземпляра вашего объекта Ruby.Вам не нужно и не должно самостоятельно освобождать переменные экземпляра Ruby (т.е.любые объекты, к которым осуществляется доступ с помощью rb_iv_set() / rb_iv_get() в вашем расширении).

Однако, если завернутый Структура C ссылается на объекты Ruby, затем вам нужно будет пометить их в mark обратный вызов, который вы передаете Data_Wrap_Struct().

(И вам всегда придется освобождать базовую структуру и выполнять любую другую очистку, которая может потребоваться, такую как закрытие файлов, сокетов и т.д.в вашем free обратный звонок.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top