В следующем коде:
class ExampleClass
def initialize
ObjectSpace.define_finalizer(self, proc{puts 'dead'})
end
end
ex = ExampleClass.new
ex = nil
GC.start
while true
# the while loop is to prevent the program from terminate
# if the program does terminate, the finalizer gets called in the end like expected
end
Финализатор здесь никогда не вызывается и не выводится. Я ожидал, что сборщик мусора соберет ex
, поскольку он был разыменован. Почему GC.start
не заставляет собирать ex
и немедленно вызывает finalizer to be called
?
dead
печатается, если я закрываю ваш код, используя control+c, а также если я заменяюwhile true end
наexit
. Я на Ruby 2.5.0-dev между прочим. На какой платформе вы находитесь? - person max pleaner   schedule 18.07.2017dead
не печатается правильно, когда я вызываюGC.start
. Я поместил туда цикл while, чтобы показать, что программа не завершается. - person aoiee   schedule 18.07.2017