2013-03-17 1 views
0

Почему ObjectSpace._id2ref дают разные выходы на Ruby 1.9 и Ruby 2.0?Почему «ObjectSpace._id2ref» дает разные результаты на Ruby 1.9 и Ruby 2.0?

Рубин 1.9.3p392 i386-mingw32

class Foo ; end 

Foo.object_id      #=> 17569464 
ObjectSpace._id2ref(17569464)  #=> Foo 

Foo.new.singleton_class.object_id #=> 17075124 
ObjectSpace._id2ref(17075124)  #=> "\x00" 

Рубин 2.0.0p0 i386-mingw32

class Foo ; end 

Foo.object_id      #=> 17197176 
ObjectSpace._id2ref(17197176)  #=> Foo 

Foo.new.singleton_class.object_id #=> 19181436 
ObjectSpace._id2ref(19181436)  #=> RangeError: 0x124af7c is recycled object 

Foo.new.singleton_class.object_id #=> 17454324 
ObjectSpace._id2ref(17454324)  #=> RangeError: 0x10a54f4 is not id value 

Foo.new.singleton_class.object_id #=> 17139816 
ObjectSpace._id2ref(17139816)  #=> "c" 

ответ

1

Просто потому, что в 2.0 сборщик мусора был defter.

# RangeError: 0x124af7c is recycled object 

состояния для объект был уже GC'ed.

UPD: Мы можем подойти к запрошенной поведение с Mutex:

2.0.0 (main):0 > Mutex.new.synchronize { 
2.0.0 (main):0 * class Foo ; end 
2.0.0 (main):0 * id = Foo.new.singleton_class.object_id 
2.0.0 (main):0 * puts id 
2.0.0 (main):0 * puts ObjectSpace._id2ref(id) 
2.0.0 (main):0 * } 
# 23172260 
# <Class:#<Foo:0x00000002c32970>> 
+0

смотрите мое 'EDIT'. С Ruby2.0, которые выводят изменения –

+0

Вы пытаетесь распечатать кусок кучи памяти, который уже очищен. Все может быть напечатано, контракт на такое не существует. Попытайтесь хотя бы включить вызовы 'new' и' _id2ref' в мьютекс. – mudasobwa

+0

Ваше предложение ценно для меня, так что вы предлагаете, не могли бы вы вставить это в свой ответ? –

 Смежные вопросы

  • Нет связанных вопросов^_^