2009-10-04 660 views
6

¿Existe un conjunto conocido (documentado) de tipos .NET que asignen memoria en la parte no administrada de la memoria del proceso?¿Qué clases administradas en .NET Framework asignan (o usan) memoria no administrada?

Por ejemplo, Microsoft documenta que la infraestructura de WPF asignó memoria no administrada para su modelo de representación retenida con el fin de optimizar el rendimiento. ¿Hay otras partes similares del framework .NET que utilizan grandes cantidades de memoria no administrada?

Respuesta

5

Si implementa IDisposable hay una muy buena probabilidad de que posee los datos no administrados, o no lo tenga poseer una clase administrada que en última instancia es propietaria de los datos gestionados. Si tiene Finalize(), es señal de que posee directamente datos no administrados.

Como regla general, si implementa IDisposable, entonces Dispose() tan pronto como haya terminado.

+1

Corregido como "IDisposable". Además, la regla más confiable es si implementa un finalizador, es casi seguro que posee datos no administrados. – bobbymcr

+1

De hecho, la mayoría de los ítems 'IDisposables' * no * (directamente) hacen algo no administrado, pero encadenan a algo que * podría *. Por ejemplo, hay un 'IDisposable' en los bloques del iterador, pero nada no administrado. –

1

Por lo que sé, no hay ningún documento único que describa o identifique qué clases en el marco utilizan recursos no administrados. La documentación de MSDN para la clase específica puede, pero eso requeriría que vea clases específicas.

En general, es una apuesta segura que muchas de las clases hacen uso de algún código no administrado en algún momento. Por ejemplo, muchos de los controles de Windows Forms son simplemente envoltorios alrededor de los controles de Win32 por lo que hacen uso de recursos no administrados.

0

Debe tener cuidado cuando una clase implementa IDisposable. Esto generalmente indica el uso de recursos no manipulados, que sin embargo no están limitados a la memoria sino que también pueden ser filehandles, sockets, etc.

Un buen indicador para esto es cuando la clase usa un IntPtr.

Cuestiones relacionadas