2

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

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

上面示例中的哈希是否可以在返回之前被释放?如果是这样,那么防止这种情况的唯一方法是确保所有分配的 Ruby 对象都被传递给的函数标记Data_Wrap_Struct,即使它们只是暂时使用?

4

1 回答 1

2

是的,如果在该块中创建其他 Ruby 对象,GC 可能会在“ Do some stuff with hash ”期间运行,例如。通过rb_str_new, rb_ary_new, 或者如果您使用 ruby​​ 内存分配函数。

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

rb_gc_register_address(VALUE *var); 

要从“忙碌”对象列表中删除对象,请使用:

rb_gc_unregister_address(VALUE *var);
于 2013-02-21T04:56:35.323 回答