青山です。

Mon, Apr 19, 1999 at 01:58:22PM +0900 において
toyofuku / juice.or.jp さん曰く:

>   普通の処理系の実装で上の例では最適化しない限り B は GC
> できないだろうと考えて「B も参照している」と書いたのですが

あの例の場合、GC されないのは単に B = [] による束縛があるからです。

式 if (i*i >= 0); A; else B; end では参照が発生しない事はもちろん、B
の参照しているオブジェクトを GC されないようにする効力も無いと思われま
す。(以下の例では remove_const を使用する為に Test クラスを使用してい
ますが、トップレベルでも同じ事のはずです)

$ ruby -e '
class Test
  A = []; B = []
  def Test.e(i); if (i*i >= 0); A; else B; end; end
  remove_const(:B) # 本当は remove_const するまでもなく、B = [] 自体が不要
  p e(1)
end
'
[]

という事で、この式は B を本当にまったく参照しないので(B が未定義という
エラーも発生しない)、この式があっても B(によって参照されていた [])は
GC されると思います。

ちょうど [ruby-talk:00284] で、まつもとさんが書かれています。

>                                                      The object no
> longer referred from anywhere, is automatically recycled.

この場合の referred とは、束縛等の事ではなく、評価の事であり(ですよね?)、
上の例でいうと、remove_const 後の B(によって参照されていた [])は
"The object no longer referred from anywhere" な状態になるので、GC の
対象になると思います。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>