删除Ruby中的类实例?

时间:2011-02-01 18:51:13

标签: ruby memory-management garbage-collection

在通过实例变量断开任何引用之后,我已经阅读了关于GC在未确定时间发生的注释,但delete方法中的第二行是愚蠢的,不必要的还是彻底的?

class MyClass
  # new instances added to @@instances
  ...
  def delete
    @@instances.delete(self)
    self.instance_variables.each{|v| self.instance_variable_set(v,nil)}
  end

end

2 个答案:

答案 0 :(得分:1)

方法delete在要从@@instances结构中删除的实例的范围内执行,因此无法进行垃圾回收。有些东西触发了该方法的运行,并且某些东西当前正在对它进行引用,因此在方法返回之后它才能被垃圾收集(并且清除了对象的引用)。

话虽如此,第二行完全没必要。即使其中一个实例变量指向对象本身,GC也足够巧妙地弄明白(或者更确切地说,它只是忽略它,因为它不是reference counting collector)。

不要尝试手动管理内存,它不会得到回报。无论您是否清除这些实例变量中对象的引用,GC都会决定何时释放它们。如果我正确地解释了你的代码示例的想法,那么在运行delete之后就会清除对宿主对象的所有引用,在这种情况下,如果它的实例变量也被清除也无关紧要,那么对象就像无论如何都有资格收集垃圾。当对象不再可访问时,它们就会被GC控制,如果其他无法访问的对象引用它们也无关紧要。

答案 1 :(得分:0)

不必要的。如果您确实要触发GC,请使用GC.startObjectSpace.garbage_collect

因为经常不能建议,再次:

http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html