Recolección de basura básicamente significa que los objetos asignados se liberan automáticamente cuando ya no se hace referencia a ellos.
Más precisamente, se liberan cuando se vuelven inalcanzables para el programa, ya que los objetos de referencia circular nunca se liberarían de otra manera.
Los punteros inteligentes solo se refieren a cualquier estructura que se comporte como un puntero normal pero tiene alguna funcionalidad adicional adjunta. Estos incluyen pero no se limitan a la dislocación, sino también a la copia en escritura, cheques encuadernados, ...
Ahora, como ha indicado, los punteros inteligentes se pueden usar para implementar una forma de recolección de basura.
Pero la línea de pensamiento sigue el siguiente camino:
- La recolección de basura es algo genial, ya que es conveniente y tengo que ocuparme de menos cosas
- Por lo tanto: quiero recolección de basura en mi idioma
- Ahora, ¿cómo puedo obtener GC en mi idioma?
Por supuesto, puedes diseñarlo así desde el principio. C # fue diseñado para ser recolectado como basura, por lo que solo new
su objeto y se liberará cuando las referencias queden fuera del alcance. Cómo se hace esto depende del compilador.
Pero en C ++, no se pretendía la recolección de basura. Si asignamos algún puntero int* p = new int;
y queda fuera del alcance, p
se elimina de la pila, pero nadie se ocupa de la memoria asignada.
Ahora, lo único que tienes desde el principio son destructores deterministas . Cuando un objeto deja el alcance en el que se ha creado, se llama a su destructor. En combinación con las plantillas y la sobrecarga de operadores, puede diseñar un objeto envoltorio que se comporte como un puntero, pero utiliza la funcionalidad del destructor para limpiar los recursos adjuntos (RAII). Usted llama a este un puntero inteligente .
Todo esto es muy específico de C ++: sobrecarga del operador, plantillas, destructores, ... En esta situación particular del lenguaje, ha desarrollado punteros inteligentes para proporcionarle el GC que desea.
Pero si diseñas un lenguaje con GC desde el principio, esto es simplemente un detalle de implementación. Solo dices que el objeto se limpiará y el compilador hará esto por ti.
Los punteros inteligentes como en C ++ probablemente no serían posibles en lenguajes como C # 's, que no tienen ninguna destrucción determinista (C # soluciona esto al proporcionar azúcar sintáctica para llamar a .Dispose()
en ciertos objetos). Los recursos no referenciados finalmente serán reclamados por el GC, pero no estarán definidos cuando sucederá exactamente esto.
Y esto, a su vez, puede permitir que el GC haga su trabajo de manera más eficiente. Al estar integrado más profundamente en el lenguaje que los punteros inteligentes, que se establecen encima de él, el GC .NET puede, por ejemplo. retrasar las operaciones de la memoria y realizarlas en bloques para abaratarlas o incluso mover la memoria para aumentar la eficiencia en función de la frecuencia con la que se accede a los objetos.