我正在使用函数Data_wrap_struct
编写Ruby扩展和Im。
为了参与Ruby的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结构的任何引用。我传递了经典的free
函数来释放内存,但我不知道如何使用标记函数。
我的结构听起来像这样
typedef struct
{
int x;
int y;
} A;
typedef struct
{
A collection[10];
int current;
} B;
我认为我需要一个标记函数来标记结构B的collection
中的引用。
有人可以给我看一个示例,看看标记功能是如何工作的吗?
答案 0 :(得分: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);
}
如果您的结构所拥有的对象未标记,则垃圾收集器可以扫描它,您的代码可能最终尝试使用已完成的对象。