やすしです。

今だに、mark/sweepを良く理解していないので教えていただけると幸いです。

From: Minero Aoki <aamine / dp.u-netsurf.ne.jp>
Subject: [ruby-ext:00687] Re: (gtk) testgtk/ctree
Date: Thu, 09 Dec 1999 16:29:44 +0900

> 落ちる原因は、
> Gtkのノードが解放されても(使われなくなっても)Ruby側にはそれが
> わからないので対応するRubyのオブジェクトはそのまま残っており、
> そのオブジェクトをマークするときに死んだノードを参照する
> ということですから、マーク関数を使っていたのがまずかったんですね。

自分の落ちる(落ちた)原因の解釈としては

row.dataに渡された Ruby objectへ GCの root([ruby-dev: 3527]参照)から、再
帰的にたぐれなくなったために(cの stackから消えたから?)、memoryが解放され
る。その後、row.dataを accessしたときに落ちる。

で、nodeを解放するときに、row.dataが Ruby objectの場合、row.destroy ==
NULL にしておいても、Ruby objectは GCの対象になる(hashなどからの参照も消
えれば)ので、ほっといても leakしない。

なのですが、どこで勘違いしてるのでしょうか?
# rb_gc_mark()は、objectに markを付けて、sweepの対象外にする?
--
            yashi