Сборка мусора в C # со ссылками на объекты - PullRequest
5 голосов
/ 04 июля 2011

В C #, когда у меня есть два объекта obj1 , obj2 , состоящих из List<string>, и я назначаю оба этих объекта одному и тому же List<string> объекту.

Если моя ссылка на obj1 выходит из области видимости, а моя ссылка на obj2 - нет, является ли obj1 по-прежнему приемлемым для сборки мусора, или есть некоторые проблемы с зависимостями, потому что есть ссылка на объект List<string>?

Ответы [ 5 ]

3 голосов
/ 04 июля 2011

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

Вам нужно взглянуть на Jon Skeet's answer здесь.Это ясно объясняет, как сборка мусора работает с объектными ссылками.

Хороший учебник для вас по Object's Lifetime in C#.

1 голос
/ 04 июля 2011

Если моя ссылка на obj1 выходит за рамки, а моя ссылка на obj2 - нет, является ли obj1 все еще пригодным для сборки мусора, или есть некоторые проблемы с зависимостями, потому что есть ссылка на объект List?

Если я вас правильно понимаю, вы имеете в виду obj1 и obj2 типа List<string> и оба указывают на один и тот же List<string> экземпляр.

Когда obj1 выходит из области видимости, все равно будет obj2 в качестве активной ссылки на экземпляр List<string>, поэтому список не может быть собран мусором.

Если obj1 был частьюссылочный тип в куче (т. е. одно из его свойств) занимаемой им памяти может быть собранным как часть внешнего объекта.Если это была просто ссылка на стек, GC не будет задействован, поскольку стек будет просто разматываться в конце вызова метода, когда obj1 выпадает из области видимости.

Имейте в виду, что obj1 - это простоссылка (в некотором смысле, указатель) на объект в куче - этот объект можно собирать мусором, только когда на него больше нет ссылок.

1 голос
/ 04 июля 2011

obj1 должен иметь право на сборку мусора, если нет ссылок на сам obj1.

0 голосов
/ 04 июля 2011

В этом вопросе определено три использования памяти:

  • указатель на экземпляр List<string> с именем obj1.
  • указатель на экземпляр List<string>вызываемый obj2.
  • Экземпляр List<string>.

, если obj1 выходит из области видимости, но obj2 нет, то после мусора остаются только следующиеколлекция:

  • указатель на List<string> экземпляр с именем obj2.
  • экземпляр List<string>.

Важнопомните, что в большинстве случаев C # абстрагирует понятие указателей, так что вы можете смело думать о obj1 и obj2 как о List<string> и не о указателях, а о указателях.

0 голосов
/ 04 июля 2011

Если obj1 является членом списка, он не будет доступен для сборки мусора, пока родительский список не будет собран сборщиком мусора.

Итак:

List<string> l = new List<string>();

string a = "one";
l.Add(a);

{
    string b = "two";
    l.Add(b);
}

В конце этого списка a находится в области видимости, b находится вне области видимости, но у обеих по-прежнему есть ссылки в списке l, поэтому ни один из них не подходит для сборки мусора.

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