(U) Ruby Extensions: rb_gc_mark () и переменные экземпляра - PullRequest
6 голосов
/ 09 июня 2009

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

1 Ответ

7 голосов
/ 10 июня 2009

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

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

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

...