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

Каково понятие "рукоятка с закрепленным 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

4b9b3361

Ответ 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). Связывание объектов не является исключительным для небезопасного кода (фиксированный оператор).