Tanaka Akira さんは書きました:
> In article <E1Mm0n8-0003NR-0p / x61.netlab.jp>,
>   Yukihiro Matsumoto <matz / ruby-lang.org> writes:
> 
>> うーん、マシンスタックに例外オブジェクトへの参照が残ってしまっ
>> てるのかもしれませんね。この辺が保守的GCの弱いところです。
> 
> 保守的GCは便利ないいわけですが、たぶん違います。
> 
> callback で生成した Proc オブジェクトの中から例外オブジェク
> トが参照されている感じですが、どういう理屈でそうなるのかはよ
> くわかりません。

tmpfile使わない版だとこんな感じ?

zsh % ~/target/svn/ruby_1_8/bin/ruby
class Err < StandardError
  def initialize obj
    @io = obj
  end
end

def cb
  proc {}
end

def tmperr
  tmpf = [open("/dev/null")]
  ObjectSpace.define_finalizer tmpf, cb
  raise Err.new(tmpf)
end

loop do
  begin
    tmperr(){}
  rescue Err => e
  end
end
^D
-:12:in `initialize': Too many open files - /dev/null (Errno::EMFILE)
        from -:12:in `open'
        from -:12:in `tmperr'
        from -:19
        from -:17:in `loop'
        from -:17
zsh: exit 1     ~/target/svn/ruby_1_8/bin/ruby