From: Kouhei S. <ko...@co...> - 2006-05-23 02:56:55
|
須藤です. 以下のようなスクリプトを実行すると,Gtk.idle_addに設定したコールバック が(もう呼ばれないのに)GCされずに残ってしまいます.このため,コールバッ クのクロージャが参照しているオブジェクトもGCされなくなってしまいます. --- require "gtk2" Gtk.init class A; end def idle_start i = 100 as = [] Gtk.idle_add do as << A.new i -= 1 if i.zero? Gtk.main_quit false else true end end end idle_start Gtk.main p [:before, ObjectSpace.each_object(A) {}] GC.start p [:after, ObjectSpace.each_object(A) {}] --- 実行結果: [:before, 100] [:after, 100] 添付のパッチを当てると,手元ではこんな実行結果になりました: [:before, 100] [:after, 2] # パッチ中で,id_relative_callbacksじゃなくてid__idle_callbacks__とかを # 使っているのはidleとかtimeoutでidが重複したら嫌だなぁと思ったからです. |