2011-12-06 14 views
8

関数Data_wrap_structを使用してRuby拡張とImを記述しています。Data_wrap_structとmark関数

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

私の構造体は、私は私がどのようにマーク機能を確認するために

は、誰かが私に例を示すことができる構造体Bのcollection内の参照をマークするマーク機能が必要だと思い、この

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

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

のように聞こえます作品ですか?

答えて

6

マーク機能は、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); 
} 

あなたの構造が所有するオブジェクトがマークされていない場合、ガベージコレクタはそれを掃引可能性があり、あなたのコードが確定したオブジェクトを使用しようとしてしまうことがあります。

+1

他のRubyオブジェクトによって参照される非Rubyオブジェクトもマークする必要がありますか?私の場合は、他のRubyクラス(それらを参照)によって作成されたウィジェットのツリーがあります。 – lzap

+0

@Izap、no。 'mark'関数は、Rubyのガベージコレクタに、Ruby仮想マシンの外部のコード(C拡張など)から作成された** Rubyオブジェクト**を伝えるために使用されます。他のネイティブ非Rubyオブジェクトを作成するRubyオブジェクトを手元に置いている場合は、Rubyオブジェクトがガベージコレクションされた後にリソースを解放する 'free'関数を実装することができます。 –

関連する問題