C/Visual C - RECOLECTOR BASURA C++

 
Vista:

RECOLECTOR BASURA C++

Publicado por Juan Alberto (3 intervenciones) el 04/08/2005 22:14:37
Hola, quisiera saber si alguno de ustedes me puede ayudar a saber como se implementa un recolector de basura para C++, tanto en la teoria, como en la practica
De antemano les agradezco la ayuda
Bye!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:RECOLECTOR BASURA C++

Publicado por fernando.gomez (1603 intervenciones) el 05/08/2005 01:07:12
Mmm... hay algunos patrones de diseño que puedes emplear para esto. El primero --quizás el más sencillo-- es emplear punteros inteligentes. Hay varios tipos de punteros inteligentes (p.e. el std::auto_ptr), pero quizás el que te convenga es aquel que se elimina cuando ya no hay objeto alguno que haga referencia a éste (como se supone trabajan el JVM y .NET). Esto lo puedes hacer manteniendo en una variable local a la plantilla del puntero inteligente el número de referencias a el puntero. En el constructor de copia --si lo hay-- así como en el operador de asignación incrementarías en uno esa variable, mientras que en el destructor, la decrementarías´, para hacer la prueba: ¿quedan referencias al puntero? Si sí, lo elminas con "delete", si no, no haces nada.

Este método es el que se emplea en la programación de componentes con COM. IUnknown --la interfaz que deben implementar todos los componentes-- tiene tres métodos: QueryInterface, AddRef y Release. ¿Adivinas qué hacen AddRef y Release?

Otra forma mucho más sencilla, pero que te puede costar en cuanto al rendimiento es usar el patrón de diseño de fábrica o factoría de clases --también empleado en COM: IClassFactory--. En este patrón, tu clase no tiene constructor público, sino privado, con lo que nadie podrá crear instancias de esa clase. Agregas un método público estático, digamos Crear(), que devuelve un puntero a una nueva instancia de la clase. Por supuesto, Crear() si tendría acceso al constructor privado.

El chiste sería que en Crear() tuvieses un array de punteros a la clase, de tal suerte que cuando se llame a Crear, añadas el puntero a la lista de array. Así, NUNCA perderás la dirección en memoria. Solamente te tendrías que preocupar de al final del programa, hacer un delete a todos los miembros del array. Esto, bien cuando esté por cerrarse el programa, o bien registrando una función en std::atexit que lo haga.

Otra opción en lugar de emplear factorías, sería sobrecargar el operador new, y que guarde la dirección de memoria en un array, igual que en la factoría. Pero o bien sobrecargas el new en TODAS las clases que quieras recolectar, o creas una clase de la cuál derivas todas las de tu programa, y que tenga el operador new sobrecargado.

El .NET Framework emplea una mezcla de ambos métodos. Cuando ocupas el operador new, se guarda una referencia al objeto creado. Éstos identifican por sí solos cuántas referencias hay en memoria. Un hilo va revisando objeto por objeto el número de referencias, y cuando encuentra una que está en cero, la elimina de memoria y del registro interno que lleva.

Una cosa por el estilo es lo que tendrías que hacer, aunque el rendimiento puede afectarte.

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar