2013-02-21 26 views
2

所以這可能是一個愚蠢的問題,但我不確定使用Ruby擴展確切的GC行爲。例如,如果我在C函數中調用rb_hash_new,然後在將值返回給Ruby代碼之前開始對其執行一些處理,那麼邏輯可能會中途中斷,並且Ruby散列會被GC收割?下面的示例代碼。在C擴展中分配的Ruby對象是否可以隨時獲得?

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

上述示例中的散列在返回之前是否可以解除分配?如果是的話,是否唯一的方法來防止這種情況發生,即使它們只是暫時使用,無論如何確保所有分配的Ruby對象都被傳遞給Data_Wrap_Struct的函數標記?

回答

2

是的,在'期間可能會運行GC'如果在該塊中創建了其他Ruby對象,例如,使用散列'做一些事情。通過rb_str_new,rb_ary_new,或者如果你使用ruby-memory分配函數。

爲了將對象標記爲「忙」的垃圾收集器,可以使用:

rb_gc_unregister_address(VALUE *var); 
+0

謝謝,I:

rb_gc_register_address(VALUE *var); 

爲了從「忙」的目的,使用的列表中刪除該對象希望有更多的文件! – ddt 2013-02-21 07:33:52

相關問題