CLR на небезопасный код и указатель указывают на массив? - PullRequest
0 голосов
/ 17 июля 2010

как CLR взаимодействует с небезопасным кодом Я нашел различные результаты в Google, но я не мог понять.Я также смущен, что сборщик мусора работает над небезопасным кодом?если да, то чем, как?

Я не могу указать указатель на первый элемент массива. Я пытаюсь использовать этот код

unsafe{

  int[] a = { 4, 5 };
  int* b = a;
  }

, но я получил эту ошибку Ошибка: Не удается неявно преобразовать тип 'int []'в 'int *'

1 Ответ

1 голос
/ 17 июля 2010

Нет причин, по которым сборщик мусора не будет работать с небезопасным кодом.Я предполагаю, что вы говорите о указателях на закрепленные объекты, например:

int[] arr = new int[100];
unsafe
{
     fixed (int* p = arr)
     { 
          // use p
     }
}

В конце блока p больше недоступен, поэтому его можно безопасно собрать.

Теперь ... это не всегда так.Вы можете передать указатель на другие функции и затем выйти из блока (на ум приходит семейство функций EnumWindows, где вы даете им указатель на структуру, а затем это можно сделать с помощью функции, в которой вы находитесь, они сами обрабатывают остальные),

Функция GC.KeepAlive (чтение хака) используется для обработки этого случая, удерживая переменную в области видимости до тех пор, пока вы действительно с ней не покончите - это верно, она ничего не делает, кроме как обманывает GC вдумая, что вы все еще используете ссылку.

...