2012-02-26 21 views
8

Quiero saber si hay alguna diferencia entre el destructor y el recolector de basura, el destructor se usa para deshacerse de todos los objetos no utilizados al final de la vida de la aplicación, igual que el uso del recolector de basura , el recolector de basura se puede llamar o hacer manualmente al final de la aplicación, lo mismo con el destructor, ambos son opcionales y se usan para deshacerse del objeto sin referencia. ¿Alguien puede indicarme cuál es la diferencia exactadiferencia entre destructor y recolector de basura

+1

.Net (como la mayoría de los lenguajes recogidos de basura) no tiene destructores. En C++/CLI se falsifican utilizando finalizadores. –

+1

@Billy la especificación del lenguaje C# ha usado los términos "finalizador" y "destructor" refiriéndose a la misma cosa. –

+0

@MarcGravell: Eso es extraño; ellos realmente tienen una semántica completamente diferente. Un concepto se ejecuta de manera determinista; el otro no es Sin embargo, estoy pensando más en el nivel CLR que en el nivel C#; después de todo, la pregunta dice .Net en lugar de C#, y en lo que respecta al CLR, los destructores no existen. –

Respuesta

6

El destructor es un especial función de miembro que se invoca cuando se destruye un objeto. Es el último método ejecutado por una clase.

El recolector de basura es parte del marco, administra automáticamente la memoria y recoge de manera no determinista objetos sin referencia para evitar fugas de memoria.

+0

El método 'Finalize' generado por el destructor se invoca cuando el GC descubre un objeto que, pero por el hecho de que el objeto se registró para la finalización, ya no existiría. A menudo es el último método que se ejecuta en un objeto de clase, pero es posible que una referencia fuerte y arraigada al objeto se pueda crear y almacenar en cualquier momento antes de que finalice (¡y posiblemente incluso antes de que comience!) En cuyo caso el objeto podría continuar existiendo indefinidamente – supercat

3

El recolector de elementos no utilizados es una parte del entorno .NET que realiza un seguimiento de los objetos y se asegura de que los objetos se eliminen de la memoria cuando ya no los necesiten.

Un destructor es parte de un diseño de clase. Es lo opuesto a un constructor. Cuando lo declaras, el GC lo llamará cuando destruya un objeto.

Here is the MSDN documentation.

6

El recolector de basura y finalizador/destructor están intrínsecamente ligadas - sin embargo, la mayoría de los objetos que no necesita (y no tienen) un destructor. En realidad, son muy raros en el código administrado, y generalmente se utilizan para garantizar que se liberen recursos no administrados. Si un objeto tiene un destructor/finalizador, el recolector de basura lo invoca al mismo tiempo que la recolección (tal vez en el próximo pase). La recolección de basura no es determinista, sucede cuando sucede, a menudo relacionada con la presión de la memoria.

Mucho más común, sin embargo, es IDisposable. Esto permite un patrón más predecible para la liberación de recursos ahora (en lugar de cuando ocurre el próximo GC). A menudo, las clases que tienen un finalizador también serán IDisposable, con la implementación Dispose() deshabilitando el destructor (no es necesario si ya hemos limpiado). Tenga en cuenta que Dispose() no está relacionado con la recolección de elementos no utilizados, pero tiene soporte de idioma a través de la instrucción "using".

IDisposable es mucho más común que los finalizadores. Usted es responsable de asegurarse de que cualquier objeto IDisposable sea eliminado. Nota adicional: deshacerse de algo no hace que el objeto sea recolectado; eso lo hace solo el GC en cualquier horario que elija el CG. Eliminación, más bien, liberar recursos asociados. Como ejemplo, no querría que un archivo se bloquee hasta que ocurra GC; el Dispose() aquí desbloquea el archivo (liberando el manejador del archivo OS).

+0

Ok, déjenme verificar si obtuve el concepto, GC se usa para verificar si se requiere deshacerse del objeto, y si alguno llamará al destructor, GC no puede destruir nada por sí mismo, y Desctructor por otro lado , destruirá el objeto al final de la clase, y destructor no puede verificar los problemas de memoria, pero destruye todo al final. estoy en lo correcto? – Abbas

+0

@Abbas múltiple "no del todo", me temo. En primer lugar, evite el término "disponer": el CG nunca "dispone" en términos si es "identificable", por lo que vale la pena mantenerse alejado de esa palabra. Ahora; el GC es responsable de reclamar la memoria en el montón administrado que utilizó cada objeto, una vez que ya no se puede acceder a cada objeto. Puede destruir cualquier cosa. Sin embargo, ** si ** hay un destructor/finalizador (y no se ha inhabilitado explícitamente para ese objeto), el GC invocará el destructor/finalizador para permitir que la clase tenga la oportunidad de limpiar cualquier recurso no administrado. –

+0

dijiste "Puede destruir cualquier cosa", y también el destructor puede destruir todo al final, en ese caso cuál es la diferencia entre ambos, sin embargo, MSDN dice "Cuando el objeto es elegible para la destrucción, el recolector de basura ejecuta el Finalice el método del objeto. ", Esto significa que GC no puede liberar memoria, tiene que llamar a destructor para liberar memoria: aquí el enlace http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx. – Abbas

0

El recolector de basura funciona principalmente copiando todos los objetos que puede encontrar en una nueva parte de la RAM y luego destruyendo el área anterior; ni sabe ni le importa si quedaron cinco o 500,000 objetos. Tenga en cuenta que además de encontrar todos los objetos a los que hacen referencia las referencias dinámicas, el recolector de elementos no utilizados también puede encontrar algunos objetos más, incluidos los objetos que reemplazan Finalize, los objetos utilizados como bloqueos de monitor, los objetos dirigidos por objetos WeakReference, etc. En el área antigua de la órbita, el recolector de basura debe ocuparse de cualquiera de los objetos "especiales" que conoce que aún podrían estar allí.

Entre otras cosas, el recolector de basura tiene una lista de todos los objetos que han registrado un finalizador; Verificará todos los objetos en esa lista para ver si todavía se han copiado a la nueva área de memoria.Si se encuentra alguno que no lo haya sido, se eliminarán de la lista de objetos con un finalizador registrado y se agregarán a una lista de objetos cuyo método Finalize se debe ejecutar tan pronto como sea posible. Una vez hecho esto para todos los objetos con un finalizador registrado, todos los objetos en la lista de objetos que necesiten finalización inmediata, así como cualquier objeto al que dichos objetos tengan una referencia, se copiarán en la nueva área.

Cuestiones relacionadas