我目前正在研究这段代码。这是一个用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