師星です。

> > どうしたもんですかね‥‥。
> 
> と、思ったんですが、set_widget()が拡張されて markerとして instance
> variableを使う必要がなければ、clear_gobject()の中で消せる?

delete_gobject()ですよね (destroyにconnectされている)。

こんな感じでしょうか?

 - Init_CList:
   rb_ivar_set(gCList, id_marker,
               Data_Wrap_Struct(rb_cData, 0, 0, clist_marker_mark));
 - set_gobject:
   klass = RBASIC(self)->klass;
   marker = rb_ivar_get(klass, id_marker);
   if (TYPE(marker) == T_DATA) {
       Data_Get_Struct(marker, void (*)(), func);
       if (func) {
           rb_ivar_set(self, id_marker, 
                       Data_Wrap_Struct(rb_cData, func, 0, gtkobj));
           /* またはdata->dmark = func;
            * (gobj_markはdfreeに移って頂くことにして)
            */
       }
   }
 - delete_gobject:
   if (! NIL_P(rb_ivar_get(obj, id_marker)))
       rb_ivar_set(obj, id_marker, Qnil);


widget固有のdestroy signal handlerなんかも考えると
struct {
  void (*mark)();
  void (*destroy)();
  /* ... */
};
のようなものを使うほうがよさそうですね。。。

 - moro.