Подтвердить что ты не робот

Что такое "корневая ссылка"?

Цитата из (Безопасный в С# не на С++, простой возврат указателя/ссылки, ответ 3) Эрик Липперт.

Также обратите внимание, что это не какая-либо ссылка на объект Person, который поддерживает его. Ссылка должна быть укоренена. У вас может быть два объекта Person, которые ссылаются друг на друга, но в противном случае недоступны; тот факт, что у каждого есть ссылка, не удерживает их в живых; одна из ссылок должна быть внедрена.

Я не понимаю, может кто-нибудь объяснить, какова корневая ссылка?

4b9b3361

Ответ 1

Это означает корень GC.

Прочитайте эту статью, возможно, это поможет с пониманием:

Корни GC не являются самими объектами, а являются ссылками на объекты. Любой объект, на который ссылается корень GC, автоматически выживет в следующей сборке мусора. В .NET есть четыре основных типа корней:

Локальная переменная в методе, который выполняется в настоящее время, считается корнем GC. Объекты, на которые ссылаются эти переменные, всегда могут быть доступны сразу по методу, в котором они объявлены, и поэтому их необходимо поддерживать. Срок службы этих корней может зависеть от того, как была построена программа. В отладочных сборках локальная переменная сохраняется до тех пор, пока метод находится в стеке. В сборках выпусков JIT может посмотреть на структуру программы, чтобы выработать последнюю точку выполнения, которая может быть использована методом, и отбрасывает ее, когда она больше не требуется. Эта стратегия не всегда используется и может быть отключена, например, запустив программу в отладчике.

Статические переменные также всегда считаются корнями GC. Объекты, с которыми они ссылаются, могут быть доступны в любое время классом, который их объявил (или остальной частью программы, если они являются общедоступными), поэтому .NET всегда будет их хранить. Переменные, объявленные как "thread static", будут сохраняться только до тех пор, пока этот поток будет запущен.

Если управляемый объект передается в неуправляемую библиотеку COM + через interop, то он также станет GC-корнем с подсчетом ссылок. Это связано с тем, что COM + не делает сборку мусора: вместо этого используется система подсчета ссылок; как только библиотека COM + завершится с объектом, установив счетчик ссылок на 0, он перестанет быть GC-корнем и может быть снова собрано.

Если объект имеет финализатор, он не сразу удаляется, когда сборщик мусора решает, что он больше не "жив". Вместо этого он становится особым видом корня, пока .NET не вызвал метод finalizer. Это означает, что эти объекты обычно требуют удаления из памяти более одной сборки мусора, поскольку они выживут в первый раз, когда они будут найдены неиспользованными.

(акцент мой)

Ответ 2

Есть все виды корневых объектов, таких как внутренние объекты CLR, объекты метаданных и т.д. Это сообщение