在Ruby中使用链表进行适当的垃圾收集?

时间:2012-02-22 08:02:36

标签: ruby garbage-collection linked-list

I am currently studying this piece of code.这是一个用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如何处理垃圾收集。您会注意到这两种方法都没有明确地销毁他们试图删除的节点。

Ruby是否足够聪明,可以从存储器中释放这个删除节点而不明确告诉它这样做?

如果还不够,我该如何正确销毁已删除的节点并释放内存?

2 个答案:

答案 0 :(得分:2)

当垃圾收集器运行时,它将看到不再从应用程序中的对象引用node,它将被解除分配。

您无需手动销毁它。

答案 1 :(得分:1)

更明确地说:

@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