/ /(U)Ruby拡張機能:rb_gc_mark()およびインスタンス変数-c、ruby、ruby-c-extension、mark-and-sweep

(U)Ruby拡張:rb_gc_mark()とインスタンス変数 - c、ruby、ruby-c-extension、mark-and-sweep

クラスを定義するルビー拡張機能を書いています。 私が使用する場合 Data_Wrap_Struct() のコールバックを実装する rb_define_alloc_func()、インスタンス変数を手動でマークして解放する必要がありますか?または、それはまだ私のために処理されますか?

回答:

回答№1の場合は7

RubyのGCは、Rubyオブジェクトのインスタンス変数で参照されます。Rubyインスタンス変数を自分で解放する必要はありませんし、すべきではありません(つまり、 rb_iv_set() / rb_iv_get() 拡張機能で)。

ただし、ラップされた場合 C構造体 Rubyオブジェクトを参照する場合は、それらをマークする必要があります mark 受け渡し先のコールバック Data_Wrap_Struct().

(そして、基礎となる構造体を常に解放する必要があり、ファイル、ソケットなどを閉じるなど、必要なその他のクリーンアップを行う必要があります free 折り返し電話。)