为什么ObjectSpace._id2ref有时会引发RangeError?

时间:2017-11-05 12:46:26

标签: ruby

在Ruby中,您可以使用ObjectSpace._id2ref(n)返回对object_id n的对象的引用。例如:

$ a = "foo"
$ a.object_id
70142658775260
$ ObjectSpace._id2ref(a.object_id)
"foo"

我正在探索这个并希望知道object_id 4是哪个对象,但是ObjectSpace._id2ref(4)会引发以下RangeError

RangeError: 0x00000000000004 is not id value

我的理解是,在Ruby 2.0之前,nil的对象id固定为4,但在Ruby 2.0中nil的对象ID为8. There's an explanation for this here

是否因为没有对象将4作为固定对象ID而引发错误?如果是这样,某些对象foo是否可能在运行时被分配object_id 4?

1 个答案:

答案 0 :(得分:1)

是的,你是对的,在2.0及之后,将没有id为4的对象,并且无法创建具有该id的对象。

排除特殊内置类型(nilfalsetrue,符号和数字),对象的ID取自其内存地址,并假设32位机器,地址需要有4字节对齐,这意味着地址的最后2位将为0。

如果是这种情况,那么理论上id 4仍然是对象的有效地址,因此是有效的id,但是该对象将存在于无效的内存地址中,因为它很可能已经被使用了要在其虚拟地址空间中运行的program itself