Pregunta

He visto recientemente un par de proyectos de código abierto que realmente hacen esto; devolver un puntero inseguro de una función, tales como: "int * entrada = this.someIterator.GetUnsafePtr ()".

A mi entender esto tiene que estar completamente equivocado. punteros inseguros sólo se pueden obtener a través de declaraciones 'fijos' y, ciertamente, los devueltos desde una función no se cubrió más (van a 'perder' su alcance declarar), haciendo que sea finalmente el recolector de basura.

Pero entonces yo no recuerdo el compilador dar ningún aviso sobre este bien, ¿por qué se molestan en utilizar una declaración fijo si realmente puede tener punteros '' no fijados extendido por todo?

¿Fue útil?

Solución

Nunca he visto este tipo de construcciones en proyectos de código abierto. Será mejor si usted proporciona algunos ejemplos de este uso en su pregunta. Significado del fuere depende de la conducta.
Pero estoy de acuerdo, punteros inseguros son malos y deben usarse sólo cuando interactúa con algunas bibliotecas nativas o código.
Por lo que yo recuerdo puede utilizar esta construcción única en el bloque inseguro. Así que creo que el compilador no dará ninguna advertencia aquí. Y la OMI es mejor utilizar IntPtr (bloques inseguras, sólo podrá ejecutarse en de plena confianza).
EDIT:
@Stephen es correcto, IntPtr no mantendrá referencia al objeto de colección GC.

Otros consejos

¿Qué tal, Marshal.AllocHGlobal o Marshal.AllocCoTaskMem, tanto IntPtr regresar, que se puede convertir libremente a void * usando la función .ToPointer()?

o el puntero puede provenir de código no administrado. Es necesario que fix/pin memoria porque la memoria se gestiona, por lo tanto, siempre y cuando no se fixed/pinned el recolector de basura es libre de moverse él, haciendo que el puntero no válido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top