Правильная сборка мусора со связанным списком в Ruby? - PullRequest
1 голос
/ 22 февраля 2012

В настоящее время я изучаю этот фрагмент кода. Это связанный список, реализованный в Ruby.Я особенно заинтересован в этих двух методах.

def removeLast
    if @size <= 0
        raise "No objects in list"
    end

    node = @last.prev
    node.prev.next = @last
    @last.prev = node.prev
    @size -= 1

    return node.object
end

def removeFirst
    if @size <= 0
        raise "No objects in list"
    end

    node = @first.next
    node.next.prev = @first
    @first.next = node.next
    @size -= 1

    return node.object
end

Эти два метода удаляют и возвращают узел из списка.Я не уверен, как Руби управляет сборкой мусора.Вы заметите, что оба метода явно не уничтожают узел, который они пытаются удалить.

Достаточно ли умен Ruby, чтобы освободить этот узел удаления из памяти без явного указания сделать это?

Если этого недостаточно, как правильно уничтожить удаленный узел и освободить его?память?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Когда запустится сборщик мусора, он увидит, что на node больше нет ссылок из объектов в вашем приложении, и он будет освобожден.

Вам не нужно будет уничтожать его вручную.

1 голос
/ 22 февраля 2012

Более подробно:

@list = ... # initialize and fill out the list

def remove_and_print_last(list)
  last = list.removeLast # 'last' is only one reference to the object and 
  puts last              # reference will be invalid out of method
end

remove_and_print_last(@list)

# here's no reference to last element, so if garbage collector would run here
# gc will free this place by adding it to the freelist
...