やすしです。 今だに、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