La recolección de basura básicamente significa que los objetos asignados se liberan automáticamente en algún momento después de que ya no se puede acceder a ellos.
Más exactamente, se lanzan cuando se vuelven inalcanzables para el programa, ya que los objetos referenciados circularmente nunca se liberarían de otra manera.
Los punteros inteligentes solo se refieren a cualquier estructura que se comporta como un puntero ordinario pero tiene alguna funcionalidad adicional adjunta. Estos incluyen , entre otros, desasignación, sino también copia en escritura, cheques encuadernados, ...
Ahora, como ha dicho, los punteros inteligentes se pueden usar para implementar una forma de recolección de basura.
Pero el tren del pensamiento va de la siguiente manera:
- La recolección de basura es algo genial, ya que es conveniente y tengo que ocuparme de menos cosas
- Por lo tanto: quiero la recolección de basura en mi idioma
- Ahora, ¿cómo puedo llevar GC a 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 lanzará cuando las referencias caigan 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 de 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 abandona el ámbito en el que se ha creado, se llama a su destructor. En combinación con las plantillas y la sobrecarga del operador, puede diseñar un objeto contenedor que se comporte como un puntero, pero utilice la funcionalidad de destructor para limpiar los recursos adjuntos (RAII). Llamas a este un puntero inteligente .
Todo esto es altamente específico de C ++: sobrecarga del operador, plantillas, destructores, ... En esta situación de lenguaje en particular, ha desarrollado punteros inteligentes para proporcionarle el GC que desea.
Pero si diseña un lenguaje con GC desde el principio, esto es simplemente un detalle de implementación. Simplemente dice que el objeto se limpiará y el compilador lo hará por usted.
Los punteros inteligentes como en C ++ probablemente ni siquiera serían posibles en lenguajes como C #, que no tienen ninguna destrucción determinista en absoluto (C # lo soluciona al proporcionar azúcar sintáctico para llamar .Dispose()
a ciertos objetos). Los recursos no referenciados finalmente serán reclamados por el GC, pero no se definió cuándo ocurrirá 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 están configurados encima, el GC .NET puede, por ejemplo, retrasar las operaciones de memoria y realizarlas en bloques para que sean más baratas o incluso mover la memoria para aumentar la eficiencia en función de la frecuencia con la que los objetos Se accede.