数据包装结构和标记函数

8

我正在编写一个Ruby扩展程序,并使用函数。

为了参与Ruby的标记和清除垃圾回收过程,我需要定义一种释放结构的例程以及一种将我的结构体引用到其他结构体标记的例程。我传递经典的函数来释放内存,但我不知道如何使用标记函数。

我的结构体看起来像这样

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

typedef struct
{
  A collection[10];
  int current;
} B;

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

有人可以给我展示一个标记函数的例子,让我看看它是如何工作的吗?

1个回答

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);
}

如果你的结构体拥有的对象没有被标记,垃圾回收器可能会将其清除,导致你的代码尝试使用已经被终结的对象。

1
我是否需要标记其他被Ruby对象引用的非Ruby对象?在我的情况下,有一棵由其他Ruby类创建的小部件树(其中包含对它们的引用)。 - lzap
@Izap,不行。mark 函数用于告诉 Ruby 的垃圾收集器有关从 Ruby 虚拟机外部代码创建的 Ruby 对象,例如 C 扩展程序。如果你手头有一个 Ruby 对象,它创建其他本地非 Ruby 对象,你可能想要实现一个 free 函数,在 Ruby 对象被垃圾回收后释放资源。 - Matheus Moreira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接