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是否足够聪明,可以从存储器中释放这个删除节点而不明确告诉它这样做?
如果还不够,我该如何正确销毁已删除的节点并释放内存?
答案 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