Использование указателей C # - PullRequest
11 голосов
/ 30 ноября 2010

Как c # использует указатели? Если C # является управляемым языком и сборщик мусора хорошо справляется с предотвращением утечек памяти и должным образом освобождает память, то каков эффект использования указателей в c # и как " unsafe "Они?

Ответы [ 3 ]

6 голосов
/ 30 ноября 2010

Чтобы использовать указатели, вы должны разрешить небезопасный код и пометить методы с помощью указателей как unsafe.Затем вам нужно исправить любые указатели в памяти, чтобы убедиться, что сборщик мусора не перемещает их:

byte[] buffer = new byte[256];

// fixed ensures the buffer won't be moved and so make your pointers invalid
fixed (byte* ptrBuf = buffer) {
    // ...
}

Это небезопасно, поскольку теоретически вы можете взять указатель, обойти все адресное пространство иповредить или изменить внутренние структуры данных CLR, скажем, для изменения реализации метода.Вы не можете сделать это в управляемом коде.

4 голосов
/ 30 ноября 2010

При использовании указателей в C # (внутри небезопасных блоков кода) память не управляется платформой. Вы несете ответственность за управление собственной памятью и очистку после себя.

... следовательно, я бы посчитал, что это довольно "небезопасно".

2 голосов
/ 30 ноября 2010

C # поддерживает указатели ограниченным образом. В C # указатель может быть объявлен только для хранения адреса памяти типов значений и массивов. В отличие от ссылочных типов, типы указателей не отслеживаются механизмом сборки мусора по умолчанию. Указатели также не могут указывать на ссылочный тип или даже на тип структуры, который содержит ссылочный тип. Таким образом, в чистом C # они имеют довольно ограниченное использование. Если их использовать в «небезопасном» коде, они будут считаться довольно небезопасными (конечно!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...