область действия связанного списка (узла) и выделение памяти или сборка мусора после возврата метода - PullRequest
0 голосов
/ 14 января 2012

Может быть, я сейчас сошел с ума, но у меня есть вопрос по поводу области, или выделения памяти, или сборки мусора.

У класса LinkedIntList есть закрытое поле front, которое является переменнойтипа ListNode (строка 4).Остальная часть связанного списка создается путем вызова функции add () (строка 29).

Вопрос: Когда возвращается add () (строка 39), создаются ли ListNode в add () новым,выходит за рамки и должны быть мусора?Или они зарезервированы, потому что фронт направлен на них цепью?

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 ]

2 голосов
/ 14 января 2012

Когда add () возвращается, ListNode, созданный и добавленный в список, зарезервирован, поскольку он является цепочкой, указываемой лицевой стороной.Параметры, передаваемые в функцию по значению, выходят из области видимости, когда функция возвращает (например, значение) в этом случае и не могут быть переданы извне.Но ListNode - это создание нового объекта, он выделяется в памяти и остается даже при возврате функции.

Сборка мусора выполняется, когда ссылки теряются в ячейке памяти.Пока ваша программа работает, ваши ссылки будут живы, поэтому сборка мусора невозможна.

1 голос
/ 14 января 2012

Объект не собирается сборщиком мусора до тех пор, пока на него нет «живой» ссылки, а именно до тех пор, пока он не будет достигнут (т.е. циклические зависимости не учитываются). Возможно, вы захотите взглянуть на метку и развернуть алгоритм .

Ваш ListNode является элементом списка, поэтому по определению не является недоступным (если вы сохраняете ссылку на заголовок списка).

Я предлагаю вам прочитать эту главу , это одно из самых ясных объяснений методов сбора мусора, которые я нашел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...