2010-11-30 18 views
10

¿Cómo hace C# el uso de punteros? Si C# es un lenguaje administrado y el colector de la basura hace un buen trabajo en la prevención de pérdidas de memoria y liberar memoria correctamente, entonces ¿cuál es el efecto del uso de punteros en C# y cómo "insegura" son?Uso de punteros C#

Respuesta

5

Para usar punteros debe permitir el código no seguro y marcar los métodos con punteros como unsafe. A continuación, tiene que corregir los punteros en la memoria para asegurarse de que el recolector de basura no los mueve:

byte[] buffer = new byte[256]; 

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

No es seguro, ya que, en teoría, se puede tomar un puntero, caminar todo el espacio de direcciones, y corrupto o cambie las estructuras internas de datos CLR para, digamos, cambiar la implementación de un método. No puedes hacer eso en código administrado.

2

C# admite punteros de forma limitada. En el puntero C# solo se puede declarar que contiene la dirección de memoria de tipos de valores y matrices. A diferencia de los tipos de referencia, los tipos de puntero no son rastreados por el mecanismo de recolección de basura predeterminado. Los punteros tampoco pueden señalar un tipo de referencia o incluso un tipo de estructura que contenga un tipo de referencia. Entonces, en C# puro, tienen usos bastante limitados. Si se usa en un código 'inseguro', se considerarían bastante inseguros (¡por supuesto!).

4

Al usar punteros en C# (dentro de bloques de códigos no seguros), la memoria no está gestionada por el Framework. Usted es responsable de administrar su propia memoria y limpiarla después de usted mismo.

... por lo tanto, lo consideraría bastante "inseguro".

+1

'La memoria no está gestionada por el framework' no es técnicamente correcta; si solo toma punteros a los objetos administrados (matrices, por ejemplo), entonces la memoria aún es administrada por el CLR, simplemente no puede hacer nada mientras está 'arreglado '... – thecoop

+0

puede distinguir la diferencia entre un puntero y un intptr. según su explicación, ¿supondría que intptr es un puntero a una memoria fija? –