(U)ルビー拡張:rb_gc_mark()とインスタンス変数
-
13-09-2019 - |
質問
私は、クラスを定義するルビーの拡張子を書いています。
私はData_Wrap_Struct()
のための私のコールバックを実装するためにrb_define_alloc_func()
を使用している場合、私は手動でマークし、インスタンス変数を解放する必要がありますか?それともまだ私のために処理されていることを?
解決
RubyのGCは、あなたのRubyオブジェクトのインスタンス変数で参照されている任意のRubyのオブジェクトを収集します。あなたがする必要はありません、自分自身(あなたの拡張でrb_iv_set()
/ rb_iv_get()
でアクセスすなわち、任意のオブジェクト)、いけない自由なRubyのインスタンス変数です。
しかし、包まれた、のCの構造体の参照をRubyのオブジェクトなら、あなたはmark
し渡しているData_Wrap_Struct()
コールバックでそれらをマークする必要があります。
(そして、あなたがいつも根底にある構造体を解放する必要があり、そのようなあなたのfree
コールバック内のファイル、ソケットなどの閉鎖などが必要な場合があり、他のクリーンアップを行います。)
所属していません StackOverflow