Понимание gcroot - PullRequest
       2

Понимание gcroot

24 голосов
/ 26 ноября 2010

Я читал эту статью , чтобы понять шаблон gcroot. Я понимаю

gcroot предоставляет ручки в куча мусора

и тот

сами ручки не мусор собраны.

Что я не понимаю, так это:

Когда объект CLR перемещается с мусорная куча, ручка вернет новый адрес объект. Переменная не должна быть закреплен, прежде чем он назначен на Шаблон gcroot.

Означает ли это, что объект CLR будет удален сборщиком мусора, даже если есть дескриптор gcroot, ссылающийся на этот объект?

Что такое «новый адрес», к которому он относится? И что это значит, что «переменная не должна быть закреплена, прежде чем она будет назначена шаблону gcroot»?

1 Ответ

30 голосов
/ 26 ноября 2010

Сборка мусора не только удаляет объекты, на которые нет ссылок, но и перемещает объекты, на которые все еще есть ссылки, например, для дефрагментации пула свободной памяти.Когда в статье говорится об объектах, перемещающихся в куче CLR, возможно, говорится, что «когда сборщик мусора перемещает объект, на который все еще ссылаются, дескриптор gcroot будет автоматически обновлен, чтобы указывать на объект CLR».не позволяйте GC перемещать объекты, используя ключевое слово pin_ptr, например:

Object ^obj = gcnew <something>;
pin_ptr pinned = obj;  /* obj won't move due to GC as long as pinned is in scope. */
/* do something interop-y here, pass to native code in a DLL, etc. */

См. эту статью для получения дополнительной информации о закреплении.

Замечание: Theстатья может иметь опечатку.Если бы он сказал «в куче, собранной для мусора» вместо «в куче, собранной для мусора», это улучшило бы ваше понимание?То, как она сформулирована в статье, звучит так, будто сама земля будет двигаться под вашими ногами, когда ГК убирает дом.

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