2011-06-17 26 views
5

Duplicar posible:
How to implement garbage collection in C++cómo implementar un recolector de basura en C++

poco me preguntaron esta pregunta en una entrevista acerca de cómo implementar un recolector de basura en C++.

Mi respuesta fue tener un grupo de memoria asignado previamente y un objeto de construcción en ese espacio asignado. También para almacenar el tamaño de la memoria asignada a un objeto en el byte que precede a la ubicación de la memoria a la que apunta el puntero.

El entrevistador no estaba satisfecho con la respuesta.

Más tarde me di cuenta de que mi solución estaba tratando de evitar el objetivo principal del recolector de basura al asignar previamente un grupo de memoria y trabajar con esa memoria.

Pero creo que sería difícil implementar un recolector de basura en C++ sin tener que modificar el compilador.

¿Alguna sugerencia? Gracias de antemano !!!

EDITAR Parece que alguien más también vino enfrentó el problema y un montón de chicos inteligentes similares han arrojado sus puntos de vista here

+2

Hay una coincidencia exacta para su búsqueda aquí: http://stackoverflow.com/questions/5009869/how-to-implement- garbage-collection-in-c Espero que ayude – Dennis

+1

Implemente un recolector de basura * en * C++, o implemente un recolector de basura * para * C++? Si ha escrito su JVM, y el lenguaje que utilizó para escribir es C++, entonces implementa su recolector de basura Java en C++ más o menos de la misma manera que implementaría un recolector de basura Java en cualquier idioma;) –

+0

Quise decir GC para C++ en C++ –

Respuesta

2

Puede leer sobre la estructura shared_ptr.

Implementa un simple recolector de basura reference-counting.

Si desea un recolector de basura real, puede sobrecargar el nuevo operador.

Crea una estructura similar a shared_ptr, llámala Object.

Esto ajustará el nuevo objeto creado. Ahora con la sobrecarga de sus operadores, puede controlar el GC.

Todo lo que hay que hacer ahora, es simplemente poner en práctica uno de los muchos GC algorithms

+0

Y asegúrese de que el usuario no permita que un puntero sin procesar "escape" el código que contiene un Objeto, igual que los usuarios de 'shared_ptr' tienen a. Tenga en cuenta que el recopilador Boehm es más inteligente que esto, utiliza la pila específica de la implementación y el análisis de objetos para marcar/barrer punteros crudos en lugar de solo objetos especiales. –

+0

sobrecargar el nuevo operador es lo que hacen las agrupaciones de memoria en C++. También me pregunto para lograr el conteo de referencias en C++? –

2

Creo que el entrevistador estaba buscando punteros inteligentes ya que eso es lo mejor que el lenguaje puede hacer e incluso entonces requiere una cierta cantidad de atención del programador. Este no es el GC correcto en el sentido CS.

+0

Sí, para implementar un GC para C++ en líneas de JAVA GC requeriría la modificación del compilador. Así que los indicadores inteligentes definitivamente son una forma. Pero no es correcto decir que los punteros inteligentes no hacen nada más que los pools de memoria con la ubicación nueva, de hecho ambos son en realidad los mismos? –

+0

@Amm: no, porque los punteros inteligentes hacen más que eso.En particular, lo que los hace interesantes es que automáticamente * liberan * la memoria administrada por ellos – jalf

Cuestiones relacionadas