Сборка мусора не только удаляет объекты, на которые нет ссылок, но и перемещает объекты, на которые все еще есть ссылки, например, для дефрагментации пула свободной памяти.Когда в статье говорится об объектах, перемещающихся в куче 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статья может иметь опечатку.Если бы он сказал «в куче, собранной для мусора» вместо «в куче, собранной для мусора», это улучшило бы ваше понимание?То, как она сформулирована в статье, звучит так, будто сама земля будет двигаться под вашими ногами, когда ГК убирает дом.