けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :13115 ] the message: "[ruby-list:13115] Re: ", on Mar/24 11:36(JST) Mitsuru Oshima writes: >大島です。 >> |>あと、大きな問題ではないと思うのですが、 >> |# 大きな問題でないってこともないと思いますけどね(^^;;; >> >> ですね.考えてませんでした. >大きな問題ではない、といったのはweak referenceのidも >weak referenceがGCされたときに、いずれは回収されるはずなので >大体OKだな、と思ったからです。もちろん、ちゃんと処理したほうが >ありがたいです。 あと, もうひとつ問題があって: obj = Object.new ref = WeakRef.new(obj) WeakRef.new(obj) # Array.new(100000000) ObjectSpace.garbage_collect ref[] なんてやると. 参照先がまだGCされていないのにGCされたことになっちゃうっ てのもありますね. ということで, 新パッチにもバグがありました(^^;; -- ここから ID_MAP = {} # obj -> [ref,...] ID_REV_MAP = {} # ref -> obj ObjectSpace.add_finalizer(lambda{|id| rids = ID_MAP[id] if rids for rid in rids ID_REV_MAP[rid] = nil end ID_MAP[id] = nil end rid = ID_REV_MAP[id] if rid ID_REV_MAP[id] = nil ID_MAP[rid].delete(id) ID_MAP[rid] = nil if ID_MAP[rid].empty? end }) -- ところで, ObjectSpace.add_finalizer(lambda{|id| rids = ID_MAP if rids for rid in rids ID_REV_MAP[rid] = nil ObjectSpace._id2ref(rid).instace_eval{@__id = nil} end ID_MAP[id] = nil end 見たいな感じにすると, __getobj__でID_MAPをいちいち見ないで済むと思うん ですがどうでしょうね? >あ、newってただの特異メソッドなのですね? ですね。 __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju / rational.com <<---