¿Qué es la recolección de basura C ++?

La recolección de basura es una técnica de administración de memoria. Es un método separado de administración automática de memoria que se utiliza en lenguajes de programación donde no se prefiere o no se realiza la administración manual de memoria. En el método de administración manual de memoria, el usuario debe mencionar la memoria que está en uso y que puede ser desasignada, mientras que el recolector de basura recolecta la memoria que está ocupada por variables u objetos que ya no están en uso en el programa. Los recolectores de basura solo administrarán la memoria, el recolector de basura no manejará otros recursos como los destructores, la ventana de interacción del usuario o los archivos.

Pocos idiomas necesitan recolectores de basura como parte del lenguaje para una buena eficiencia. Estos idiomas se denominan idiomas recolectados de basura. Por ejemplo, Java, C # y la mayoría de los lenguajes de secuencias de comandos necesitan recolección de basura como parte de su funcionamiento. Mientras que los lenguajes como C y C ++ admiten la gestión manual de memoria que funciona de manera similar al recolector de basura. Hay pocos idiomas que admitan tanto la recolección de basura como la asignación / desasignación de memoria administrada manualmente y, en tales casos, se asignará un montón de memoria separada al recolector de basura y la memoria manual.

Algunos de los errores se pueden evitar cuando se utiliza el método de recolección de basura. Como:

  • problema de puntero colgante en el que la memoria apuntada ya está desasignada, mientras que el puntero aún permanece y señala diferentes datos reasignados o memoria ya eliminada
  • El problema que ocurre cuando intentamos eliminar o desasignar una memoria por segunda vez que ya ha sido eliminada o reasignada a otro objeto
  • elimina problemas o errores asociados con las estructuras de datos y gestiona la memoria y los datos de manera eficiente
  • se pueden evitar pérdidas de memoria o problemas de agotamiento de memoria

Veamos una comprensión detallada de la gestión manual de memoria frente a la recolección de basura, ventajas, desventajas y cómo se implementa en C ++.

Gestión manual de memoria

La memoria asignada dinámicamente durante el tiempo de ejecución desde el montón debe liberarse una vez que dejamos de usar esa memoria. La memoria asignada dinámicamente toma memoria del montón, que es un almacén de memoria libre.

En C ++, esta asignación de memoria y desasignación se realizan manualmente mediante comandos como nuevo, eliminar. El uso de memoria 'nueva' se asigna desde el montón. Después de su uso, esta memoria debe borrarse utilizando el comando 'eliminar'.

Cada asignación de memoria con 'nuevo' debe terminarse con un comando 'eliminar'. Si no, nos quedaremos sin memoria.

Para mostrarlo claramente con un ejemplo:

n = nuevo objeto_muestra;
******* el uso se implementa aquí *******
eliminar n;

Como se muestra, cada nuevo debe terminar o inclinarse con un comando de eliminación. Aquí se asigna memoria a un puntero n usando el comando 'nuevo' y se hace referencia o apunta a un objeto llamado 'objeto_muestra'. Una vez que se completa el uso y el funcionamiento del puntero, debemos liberar o liberar la memoria utilizando el comando 'eliminar' como se hizo anteriormente.

Pero en caso de recolección de basura, la memoria se asigna mediante el comando 'nuevo', pero no es necesario liberarla manualmente mediante 'eliminar'. En tales casos, el recolector de basura se ejecuta periódicamente buscando memoria libre. Cuando un objeto no apunta a un trozo de memoria, borra o libera la memoria creando más espacio libre.

Ventajas y desventajas de la gestión manual de la memoria

Las ventajas de la gestión manual de la memoria son que el usuario tendría un control completo sobre las operaciones de asignación y desasignación y también sabría cuándo se asigna una nueva memoria y cuándo se desasigna o libera. Pero en el caso de la recolección de basura, en la misma instancia exacta después del uso, la memoria no se liberará, se liberará cuando la encuentre durante la operación periódica.

También en el caso de la gestión manual de la memoria, se llamará al destructor en el mismo momento cuando llamamos al comando 'eliminar'. Pero en caso de recolector de basura que no está implementado.

Hay algunos problemas asociados con el uso de la administración manual de memoria. A veces podemos tender a eliminar dos veces la memoria ocupada. Cuando eliminamos el puntero o la memoria ya eliminados, hay posibilidades de que el puntero haga referencia a otros datos y pueda estar en uso.

Otro problema que tenemos en la gestión manual de la memoria es que, si obtenemos una excepción durante la ejecución o el uso del nuevo puntero asignado de memoria, saldrá de la secuencia de 'nuevo' y 'eliminar' y la operación de liberación no será realizado. Además, puede haber problemas de pérdida de memoria.

Ventajas y desventajas del recolector de basura

Una desventaja importante de la recolección de basura es el tiempo involucrado o los ciclos de CPU involucrados para encontrar la memoria no utilizada y eliminarla, incluso si el usuario sabe qué memoria de puntero se puede liberar y no usar. Otra desventaja es que no sabremos el momento en que se elimina ni cuándo se llama al destructor.

Algoritmo de Recolección de Basura

Hay muchos algoritmos de recolección de basura, tales como conteo de referencias, marca y barrido, copia, etc. Veamos un algoritmo en detalle para una mejor comprensión. Por ejemplo, cuando vemos el algoritmo de conteo de referencia, cada memoria dinámica tendrá un conteo de referencia. Cuando se crea una referencia, el recuento de referencias aumentará y cada vez que se elimina una referencia, el recuento de referencias disminuye. Una vez que el recuento de referencia se convierte en cero, muestra que la memoria no se utiliza y se puede liberar.

Este algoritmo se puede implementar en C ++ usando un tipo de puntero específico. Se debe declarar un tipo de puntero específico y esto se puede utilizar para fines como realizar un seguimiento de todas las referencias creadas, realizar un seguimiento del recuento de referencias cuando se crea y elimina la referencia. Un programa C ++ puede contener tanto la gestión manual de la memoria como la recolección de elementos no utilizados en el mismo programa. Según la necesidad, se puede usar el puntero normal o el puntero específico del recolector de basura.

En resumen, la recolección de basura es un método opuesto a la administración manual de memoria. En un recolector de basura, la memoria se libera automáticamente en función de un tiempo periódico o de un criterio específico que indica si ya no está en uso. Ambos métodos tienen sus propias ventajas y desventajas. Esto se puede implementar y usar de acuerdo con la complejidad de la función, dependiendo del idioma utilizado y su alcance.

Artículos recomendados

Esta es una guía para la recolección de basura en C ++. Aquí discutimos la gestión manual de la memoria y el algoritmo de recolección de basura junto con las ventajas y desventajas. También puede consultar nuestros otros artículos sugeridos para obtener más información:

  1. Constructor y Destructor en Java
  2. Funciones de cadena de C ++
  3. Destructor en Java
  4. Aplicaciones de C ++ en el mundo real
  5. Las 11 características y ventajas principales de C ++