(U) Расширения Ruby:rb_gc_mark() и переменные экземпляра
-
13-09-2019 - |
Вопрос
Я пишу расширение 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
обратный звонок.)