2012-02-22 12 views
1

I am currently studying this piece of code. Rubyで実装されているリンクリストです。 私は特にこの2つの方法に興味があります。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 

これらの2つのメソッドは、ノードを削除してリストから返します。 Rubyがガベージコレクションをどのように処理するのかよくわかりません。両方のメソッドが、削除しようとしているノードを明示的に破棄しないことに気づくでしょう。

明示的にそうするように言わずに、メモリからこの削除ノードを解放するのにRubyはスマートですか?

もし十分ではない場合、削除したノードを適切に破棄してメモリを解放するにはどうすればよいですか?

答えて

2

ガベージコレクタが実行されると、nodeはアプリケーションのオブジェクトから参照されなくなり、割り当てが解除されます。

手動で削除する必要はありません。

+0

は、Rubyはそのスマートです知りませんでした!ありがとう –

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 
関連する問題