こんにちは。阿部といいます。 現在、拡張モジュールを使ったプログラミングを行っています。 そのプログラム中では、オブジェクト A がオブジェクト B を参照しており、 struct _B { VALUE value; }; typedef struct _B B; struct _A { B * b; }; typedef struct _A A; void A_mark ( A * ptr ) { rb_gc_mark( ptr->b->value ); } 上記のようなプログラムになっています。(模式的なものです) スクリプトの実行が終了し、rb_cleanup() が呼び出されるとオブジェクト の破棄が始まります。 このとき、 オブジェクト B の破棄 → GC マークの開始 → A_mark() が呼び出される → ptr->b->value を評価するが既に b が削除されているためエラー発生 という現象が起こりました。 上のようなプログラムを書く方が悪いのでしょうか。 何か解決方法がありましたら、教えていただきたいと思います。 よろしくお願いします。 # rb_cleanup() などにコードを加え、cleanup 中は GC を無効化する #という方法もあるのでしょうが… -------- 阿部 茂 (shiger-a / nifty.com)