こんにちは。阿部といいます。

 現在、拡張モジュールを使ったプログラミングを行っています。
 そのプログラム中では、オブジェクト 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)