Ruby中带有链表的正确垃圾收集



我目前正在研究这段代码。这是一个用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是否足够聪明,可以在不明确告诉它的情况下从内存中释放这个remove节点?

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

当垃圾收集器运行时,它将看到node不再从应用程序中的对象中被引用,并且它将被释放。

您不需要手动销毁它。

更明确地说:

@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

相关内容

  • 没有找到相关文章

最新更新