Как С# использует указатели? Если С# - управляемый язык, и сборщик мусора хорошо справляется с предотвращением утечек памяти и освобождением памяти должным образом, то каков эффект использования указателей в С# и как они " небезопасные"?
Использование указателей С#
Ответ 1
Чтобы использовать указатели, вы должны разрешить небезопасный код и пометить методы с помощью указателей как 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
При использовании указателей на С# (внутри небезопасных блоков кода) память не управляется Framework. Вы несете ответственность за управление собственной памятью и очистку после себя.
... поэтому я бы подумал, достаточно ли "небезопасно".
Ответ 3
С# поддерживает указатели ограниченным образом. В С# указатель может быть объявлен только для хранения адреса памяти типов значений и массивов. В отличие от ссылочных типов, типы указателей не отслеживаются механизмом сбора мусора по умолчанию. Указатели также не могут указывать на ссылочный тип или даже на тип структуры, который содержит ссылочный тип. Таким образом, в чистом С# они имеют довольно ограниченное использование. Если они используются в "небезопасном" коде, они будут считаться довольно опасными (конечно!).