¿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
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.
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!).
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. Objetivo-C uso de punteros
- 2. uso constante con punteros en C
- 3. C++: Uso de punteros de función con funciones de miembro
- 4. matriz de punteros C
- 5. punteros de Objective-C?
- 6. C++ vector de punteros
- 7. Void punteros a struct punteros en C
- 8. C++ Punteros a punteros en Java
- 9. Uso de operadores sobrecargados en punteros
- 10. C++: cuándo usar punteros?
- 11. C# punteros vs IntPtr
- 12. Uso de decltype con punteros de función de miembro virtual
- 13. C++: Punteros y alcance
- 14. Incrementando punteros C
- 15. punteros C++ a operadores
- 16. punteros void en C++
- 17. punteros C Pregunta
- 18. punteros vacío en C++
- 19. alcances y C++ punteros
- 20. Inicializando punteros en C++
- 21. Declaración de punteros en C++
- 22. Aritmética de punteros en C
- 23. Punteros de función en C#
- 24. punteros de matriz C++ [] o ++
- 25. C/C++: Punteros dentro de Const Struct
- 26. ¿Cómo usar los punteros inteligentes de C++?
- 27. punteros inteligentes en C++: compartir punteros vs. compartir datos
- 28. Punteros externos y estáticos en C
- 29. Cadenas y punteros en C++
- 30. C: ¿Punteros a cualquier tipo?
'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
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? –