2012-01-14 6 views
0

私は今考えていないかもしれませんが、スコープ、メモリ割り当て、またはガベージコレクションに関する質問があります。リンクされたリスト(ノード)スコープとメモリ割り当てまたはメソッドが返された後のガベージコレクション

クラスLinkedIntListには、ListNodeタイプ(行4)の変数であるprivateフィールドfrontがあります。 リンクされたリストの残りは、add()関数を呼び出すことによって構成されます(29行目)。

質問:add()が返されたとき(39行目)、addNodeで作成されたListNodeがnewでスコープ外にあり、ガベージコレクションされるはずですか?または、フロントが連鎖しているので予約されていますか?

1 // Simple first version of LinkedIntList with just a constructor 
2 // and methods for add and toString. 
3 
4 public class LinkedIntList { 
5 private ListNode front; // first value in the list 
6 
7 // post: constructs an empty list 
8 public LinkedIntList() { 
9 front = null; 
10 } 
11 
//.... 
//.... 
28 // post: appends the given value to the end of the list 
29 public void add(int value) { 
30 if (front == null) { 
31 front = new ListNode(value); 
32 } else { 
33 ListNode current = front; 
34 while (current.next != null) { 
35 current = current.next; 
36 } 
37 current.next = new ListNode(value); 
38 } 
39 } 
40 } 

答えて

2

add()が返されたとき、リストに作成されて追加されたListNodeは、フロントでチェーンが指すように予約されています。この場合関数が(値のように)返ってくると、値によって関数に渡されたパラメータが範囲外になり、外部から参照することはできません。しかし、ListNodeは新しいObjectの作成であり、メモリ内の領域が割り当てられ、関数が返っても保持されます。

ガベージコレクションは、参照がメモリ位置に失われたときに行われます。あなたのプログラムが実行されている間、あなたの参照は生きているので、ガベージコレクションはできません。

1

オブジェクトはガベージコレクタによって「ライブ」参照があるまで、つまり到達可能になるまで(つまり、循環依存性はカウントされないまで)収集されません。 mark and sweepアルゴリズムを見てください。

あなたのListNodeはリストの要素なので、(リストヘッドへの参照を保持する限り)定義には到達できません。

これは、私が見つけたガベージコレクションテクニックのはっきりとした説明の1つです。this chapterを読むことをお勧めします。

+0

ありがとうございます。両方の皆さん、ShraddhaとSavinos、私は正しい方向に私を得る、本当に感謝します!しかし、 "ダニ"のためのものがあるので、私は最初の返信を "尋ねた"。 –

関連する問題