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

上記の例のハッシュは、返される前に割り当てが解除される可能性がありますか? Data_Wrap_Structもしそうなら、これを防ぐ唯一の方法は、割り当てられたすべてのRubyオブジェクトが、一時的にしか使用されていない場合でも、 渡された関数によってマークされるようにすることですか?

4

1 に答える 1

2

はい、そのブロックで他のRubyオブジェクトを作成すると、 「 Do some stuff with hash 」中にGCが実行される可能性があります。rb_str_new、 、または ruby ​​-memoryrb_ary_new割り当て関数を使用する場合。

ガベージ コレクタに対してオブジェクトを「ビジー」としてマークするには、次を使用します。

rb_gc_register_address(VALUE *var); 

「ビジー」オブジェクトのリストからオブジェクトを削除するには、次を使用します。

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