師星です。

> 	添付されていたパッチを当てて再度スナップショットで
> 	試して見ましたがまだ落ちるようです。
> 	gdbで動作を追いかけてみました。Gtk::CListのGCでのmark
> 	で落ちているようです。
> 	シーケンスを追っかけてみたら
> 
> 		(1). Gtk::CListを含むGtk::Windowを生成
> 		(2). (1)で作ったWindowをdestroy
> 			=> この時GtkClistで使用している領域を開放
> 		(3). Gtk::FileSelectionを生成
> 			=> この時(2)で開放された領域をGtkFileSelectionに
> 			   GTK+が割り当てる模様
> 		(4). その後の動作でGC::start
> 		(5). (1)で作ったオブジェクトをmarkしようとclist_marker_mark()
> 		   を呼び出し
> 			=> ここでGtkClist*からrow_listを評価する時に
> 			   Segmentation fault。
> 
> 	(1)で生成されたオブジェクトの領域がまだRubyのGCチェック対象
> 	になっている様子ですが(未確認)、GTK+の世界では(3)で
> 	GtkFileSelectionに割り当て済なので論理矛盾が起こる…という
> 	感じのようです。

なるほど。
destroyまわりは見落としていました。

> 	どうもGtkCListのdestroy時にRuby側でもGCのチェック対象から
> 	外すようなコードが必要なようです。

ad hocにはこんなところでしょうか。

ただ、個別のwidgetでばらばらにsignal handlerをconnectしてしまうことにな
る点については、他の方のご指導を頂きたいところです。

diff -u /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkclist.c.orig /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkclist.c
--- /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkclist.c.orig	Sun Oct 22 20:43:58 2000
+++ /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkclist.c	Sun Oct 22 20:43:58 2000
@@ -34,6 +34,12 @@
     }
 }
 
+static void
+clist_clear_marker(GtkObject *widget, VALUE self)
+{
+    rb_ivar_set(self, id_marker, Qnil);
+}
+
 static VALUE
 clist_initialize(self, titles)
     VALUE self, titles;
@@ -59,6 +65,9 @@
     rb_ivar_set(self, id_marker, Data_Wrap_Struct(rb_cData, clist_marker_mark,
 						  0, widget));
 
+    gtk_signal_connect((GtkObject*)widget, "destroy",
+		       clist_clear_marker, (gpointer)self);
+    
     return Qnil;
 }
 /* 1.2.x
diff -u /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkctree.c~ /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkctree.c
--- /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkctree.c~	Sun Oct 22 21:12:06 2000
+++ /home/moro/gnome-ruby-snapshot/gtk/src/rbgtkctree.c	Sun Oct 22 21:12:06 2000
@@ -52,6 +52,11 @@
     return c_node;
 }
 
+static void
+ctree_clear_marker(GtkObject *widget, VALUE self) {
+    rb_ivar_set(self, id_marker, Qnil);
+}
+
 /*
  * initialize(titles, tree_column)
  *
@@ -85,6 +90,9 @@
 
     rb_ivar_set(self, id_marker, Data_Wrap_Struct(rb_cData, ctree_marker_mark,
 						  0, widget));
+
+    gtk_signal_connect((GtkObject*)widget, "destroy",
+		       ctree_clear_marker, (gpointer)self);
 
     return Qnil;
 }