Стоит ли беспокоиться об освобождении ресурсов в этом случае? - PullRequest
2 голосов
/ 16 июля 2009

Допустим, у меня есть класс Collection, который содержит список предметов.

public class Collection
{
    private List<Item> MyList;
    //...
}

У меня есть несколько экземпляров этого класса Collection, которые имеют разные списки MyList, но совместно используют некоторые элементы. Например: в списке 10 элементов, ссылки Collection1 на элементы 1-4, коллекции Collection2 есть элементы 2-8 и Collection3 4,7,8 и 10.

Я реализовал это следующим образом: у меня есть один глобальный список, который содержит любые доступные элементы. Перед созданием новой Коллекции я проверяю, есть ли уже нужные мне Предметы в этом списке - если нет, я создаю Предмет и добавляю его в глобальный Список (и, конечно, в Коллекцию).

Проблема, которую я вижу, состоит в том, что эти Элементы никогда не будут выпущены - даже если все Коллекции исчезнут, память, которую они потребляют, все еще не освобождена, потому что глобальный список все еще ссылается на них. Это то, что мне нужно беспокоиться? Если так, что я должен сделать? Я подумал о добавлении счетчика в глобальный список, чтобы увидеть, когда Предмет больше не нужен, и удалить его ссылку.

Edit: На самом деле это проблема дизайна, я думаю. Я откажусь от идеи глобального списка и вместо этого переберу все коллекции и посмотрю, есть ли у них уже нужный предмет.

Ответы [ 2 ]

2 голосов
/ 16 июля 2009

Если глобальный список нуждается в ссылках на элементы, то вы не сможете реально освободить их. Вам действительно нужны ссылки на элементы в глобальном списке? Когда вам логически удастся удалить элементы из глобального списка?

Вы можете рассмотреть возможность использования слабых ссылок в глобальном списке и периодически сокращать сами значения WeakReference, если их референты были собраны.

1 голос
/ 16 июля 2009

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

Помимо слабых ссылок, о которых упоминает Джон, вы также можете периодически перестраивать глобальный список (например, после удаления коллекции) или создавать его динамически только тогда, когда вам это нужно, и выпустить его снова.

Вам нужно решить, какой метод наиболее подходит, у нас здесь недостаточно контекста.

...