Удалить экземпляр класса в Ruby? - PullRequest
2 голосов
/ 01 февраля 2011

Я читал заметки о 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 ]

1 голос
/ 01 февраля 2011

Метод delete выполняется в области действия экземпляра, удаляемого из структуры @@instances, поэтому он не может быть собран сборщиком мусора. Что-то вызвало запуск этого метода, и что-то в данный момент содержит ссылку на него, поэтому его нельзя собирать до тех пор, пока метод не будет возвращен (и ссылка на объект не будет очищена).

При этом вторая строка совершенно не нужна. Даже если одна из переменных экземпляра указывает на сам объект, GC достаточно умен, чтобы понять это (или, скорее, он просто игнорирует это, так как это не коллектор подсчета ссылок ).

Не пытайтесь вручную управлять памятью, она не окупится. Независимо от того, очищаете ли вы ссылки на объекты в этих переменных экземпляра, GC решает, когда они будут освобождены. Если я правильно истолковываю идею вашего примера кода, все ссылки на хост-объект очищаются после выполнения delete, и в этом случае не имеет значения, очищаются ли его переменные экземпляра, объекты будут иметь такое же право на сборка мусора в любом случае. Объекты помечаются GC, когда они больше недоступны, не имеет значения, имеют ли ссылки на них другие недоступные объекты.

0 голосов
/ 01 февраля 2011

Ненужное.Если вы действительно хотите запустить GC, используйте GC.start или ObjectSpace.garbage_collect.

И поскольку это не может быть рекомендовано достаточно часто, еще раз:

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

...