2010-11-30 2 views
10

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

ответ

5

Чтобы использовать указатели, вы должны разрешить небезопасный код и пометить методы с помощью указателей как 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, скажем, изменить реализацию метода. Вы не можете сделать это в управляемом коде.

2

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

4

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

... поэтому, я считаю, что достаточно «небезопасно».

+1

«Память не управляется каркасом» не является технически правильной; если вы просто берете указатели на управляемые объекты (например, массивы), то память по-прежнему управляется CLR, она просто ничего не может с ней сделать, пока она «исправлена» ... – thecoop 2010-11-30 17:39:33

Смежные вопросы