在C扩展中分配的Ruby对象可以随时获得收益吗?

在C扩展中分配的Ruby对象可以随时获得收益吗?,c,ruby,C,Ruby,所以这可能是一个愚蠢的问题,但我不确定Ruby扩展的确切GC行为。例如,如果我在C函数中调用rb\u hash\u new,然后在将值返回Ruby代码之前开始对其进行一些处理,那么逻辑是否会中途中断,Ruby hash是否会被GC获取?下面是示例代码 VALUE my_function(VALUE rb_self) { VALUE hash = rb_hash_new(); // Do some stuff with hash return hash; } 上面例子中的

所以这可能是一个愚蠢的问题,但我不确定Ruby扩展的确切GC行为。例如,如果我在C函数中调用
rb\u hash\u new
,然后在将值返回Ruby代码之前开始对其进行一些处理,那么逻辑是否会中途中断,Ruby hash是否会被GC获取?下面是示例代码

VALUE my_function(VALUE rb_self) {
    VALUE hash = rb_hash_new();
    // Do some stuff with hash
    return hash;
}

上面例子中的散列能否在返回之前被释放?如果是这样,那么防止这种情况发生的唯一方法是确保所有分配的Ruby对象都被传递到
Data\u Wrap\u Struct
的函数标记,不管发生什么情况,即使它们只是暂时使用

是的,如果在该块中创建其他Ruby对象,例如通过
rb_str_new
rb_ary_new
,或者如果使用Ruby内存分配函数,则GC可能会在“使用哈希做一些事情”期间运行

要将垃圾收集器的对象标记为“忙碌”,请使用:

rb_gc_register_address(VALUE *var); 
要从“忙碌”对象列表中删除该对象,请使用:

rb_gc_unregister_address(VALUE *var);

谢谢,我希望有更多的文档!