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中的引用.
有人可以给我看一个例子来看看标记功能是如何工作的吗?
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)
如果您的结构所拥有的对象未被标记,则垃圾收集器可以扫描它,并且您的代码可能最终尝试使用已完成的对象.
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |