原です。

> 青山です。

> $ ruby -e '
> class Test
>   TheArray = []
> end
> class YaArray
>   def initialize; @BaArray = Test::TheArray; end
>   def push(x); @BaArray.push x; end
>   def e(i); @BaArray[i]; end
> end
> Proc.new {
>   foo = YaArray.new
>   # この段階で、Test::TheArray の参照していた [] を foo も参照。
>   class Test
>     remove_const(:TheArray)
>   end
>   #p Test::TheArray # ==> uninitialized constant Test::TheArray (NameError)
>   # [] を参照していた Test::TheArray が無くなっても、foo が参照してい
>   # るので [] は GC されない。
>   foo.push("obj1")
>   foo.push("obj2")
>   p foo.e(0) #=> "obj1"
>   p foo.e(1) #=> "obj2"
> }.call
> #p Test::TheArray # ==> uninitialized constant Test::TheArray (NameError)
> #p foo # ==> undefined local variable or method `foo'
> # [] を参照していた foo も無くなれば、おそらくは [] も GC される。
> '
> "obj1"
> "obj2"

この例では [] に @BaArray が束縛された時点でオブジェクト foo
と [] の参照関係が成立してしまうということでいいのでは無いで
しょうか。元の YaArray のインスタンスにはインスタンス変数が
無い所が話をややこしくしているのだと思います。