Data_wrap_struct和标记功能

Pio*_*ioz 8 c ruby ruby-c-extension

我正在编写Ruby扩展并使用该函数Data_wrap_struct.

为了参与Ruby的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结构的任何引用.我通过经典free函数释放内存,但我不知道如何使用标记功能.

我的结构听起来像这样

typedef struct
{
  int x;
  int y;
} A;

typedef struct
{
  A collection[10];
  int current;
} B;
Run Code Online (Sandbox Code Playgroud)

我认为我需要一个标记函数来标记collection结构B中的引用.

有人可以给我看一个例子来看看标记功能是如何工作的吗?

Mat*_*ira 6

mark函数用于标记C结构拥有的任何Ruby对象.

typedef struct {
    VALUE ruby_object;
} MyStruct;

void mark(void * p) {
    /* p is the wrapped pointer to the MyStruct instance */
    MyStruct * my_struct = (MyStruct *) p;
    rb_gc_mark(my_struct->ruby_object);
}
Run Code Online (Sandbox Code Playgroud)

如果您的结构所拥有的对象未被标记,则垃圾收集器可以扫描它,并且您的代码可能最终尝试使用已完成的对象.