8

Ruby 拡張機能を作成し、関数を使用していますData_wrap_struct

Ruby のマーク アンド スイープ ガベージ コレクション プロセスに参加するには、構造体を解放するルーチンと、構造体から他の構造体への参照をマークするルーチンを定義する必要があります。クラシックfree関数を渡してメモリを解放しますが、マーク関数の使用方法がわかりません。

私の構造体はこのように聞こえます

typedef struct
{
  int x;
  int y;
} A;

typedef struct
{
  A collection[10];
  int current;
} B;

collection構造体 Bの参照をマークするには、マーク関数が必要だと思います。

マーク機能がどのように機能するかを確認するための例を誰かに見せてもらえますか?

4

1 に答える 1

6

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

構造体が所有するオブジェクトがマークされていない場合、ガベージ コレクターがそれを一掃し、コードがファイナライズされたオブジェクトを使用しようとする可能性があります。

于 2012-02-24T17:08:04.570 に答える