Каково понятие "рукоятка с закрепленным GC"?
Когда мы анализируем кучи памяти, следуя 4 типам ручек GC, мы обычно сталкиваемся:
-
Слабый: - Слабая рукоятка GC не будет препятствовать тому, чтобы экземпляр, который он соответствует, был собран из мусора. Example, used by the System.WeakReference class instances
.
-
Обычный: - Обычная ручка GC предотвращает сбор соответствующего мусора. Example, used by the instances of strong references
.
-
RefCounted: - Контрольная метка GC, используемая по ссылке, используется внутренне с помощью среды выполнения, example, when dealing with COM interfaces.
-
Pinned: - Зачем нам нужен такой ручка GC? Это просто для того, чтобы избежать перемещения этого экземпляра в памяти или is there any other notion behind this? I want to know the notion behind Pinned GC handle(with an example).
Отредактировано для ответа Itay: - У меня есть пустой массив - DiffCell [] [], привязанный к сетке данных в WPF. Когда я закрываю окно, в котором присутствует эта сетка данных, я вижу, что дескриптор Pinned GC указывает на этот пустой массив DiffCell через объект [] (см. Снимок). I am not using any unsafe code. I am just setting ItemsSource of data grid to null before closing that window. So my question is who does pin this array on heap and why?
![alt text]()
Ответы
Ответ 1
Нам это нужно, если мы используем указатели.
Представьте, что вы объявляете указатель на ячейку памяти, и вы не подключаетесь.
GC иногда перемещает куски памяти в другие места, чтобы ваш указатель стал недействительным.
например:
public unsafe void DoSomething(byte b)
{
byte * bp = &b;
}
это не скомпилируется, потому что вы не исправили местоположение памяти, в котором хранится байт.
Чтобы вывести его, вы можете использовать:
public unsafe void DoSomething(byte b)
{
fixed(byte * bp = &b)
{
//do something
}
}
Ответ 2
Не забывайте GCHandle, который поддерживает привязывание объектов (и получение адреса как IntPtr). Связывание объектов не является исключительным для небезопасного кода (фиксированный оператор).