From: yamazaki <yamazaki / nal.go.jp> Subject: [ruby-ext:00641] (gtk) testgtk/ctree (Ruby/GTK SNAPSHOT-19991129) Date: Thu, 2 Dec 1999 12:25:52 +0900 (JST) > testgtk/ctree.rb のバグが気になるので、調べています。 > > layout を出さず、ctree だけでも何回か出すと落ちます。 おや〜、と思ってやってみると、ゆれがあるし‥‥。 > [ruby-ext:00600] の patch なんですが、row.destroy というのは、 > CListRow のメンバの GtkDestroyNotify destroy; ではないでしょうか。 > これは、void (*GtkDestoyNotify)(gpointer data); という関数ポインタ > で、node_set_row_data メソッドで設定したときは NULL になるようです。 「row.dataに自分で dataを入れたときには、memory leakを避けるために自前で row.dataを freeしなければならないので GCにそれをさせるために markしてい る」と言うのが自分の理解なんですが、あってますか? 上記が真であったときに、Ruby/Gtkでは以下の関数で static VALUE ctree_node_set_row_data(self, node, data) VALUE self, node, data; { gtk_ctree_node_set_row_data(GTK_CTREE(get_widget(self)), get_ctree_node(node), (gpointer)data); bind_ctree_node(self, node); return self; } row.dataに VALUEをわたしているので、markすべきですよね? で、row.data == NULLだと、Gtk自前の関数で freeと‥。 > 結局このパッチだと、常に真となって、変わらないように思います。 > (相変わらず落ちる) そちらではうまくいっているのでしょうか。 常に真とならないのは、 if (GTK_CTREE_ROW(node) && GTK_CTREE_ROW(node)->row.data && ! GTK_CTREE_ROW(node)->row.destroy) { rb_gc_mark(GTK_CTREE_ROW(node)->row.data); } else { g_print("node not marked\n"); } な、事をしてもらえれば、わかると思いますが、ゆれてます(涙) # そしてゆれがあるやつにかぎって、debugはじめると落ちないでやんの‥。 p.s. structの方、まだためしてません、ごめんなさい。 しかも、grep struct *.hで、でたなんて‥‥‥‥(__;; -- yashi