Recolección de basura en C++
- Recolección de basura como técnica de gestión de la memoria
- Gestión manual de memoria en C++
- Problemas con la gestión manual de la memoria en C++
- Algoritmos para la recolección de basura
En este artículo, aprenderemos sobre la recolección de basura en C++.
Recolección de basura como técnica de gestión de la memoria
La recolección de basura es una de las técnicas de administración de memoria utilizadas en los lenguajes de programación. Es una técnica de administración de memoria automática agregada como característica para muchos lenguajes de programación.
El recolector de elementos no utilizados recopila o recupera la memoria asignada a variables u objetos, pero el programa ya no la utiliza; esto también se denomina basura.
Una cosa a tener en cuenta es que el recolector de basura solo administra la memoria o recursos como archivos. Las ventanas de interfaz de usuario y los destructores no son manejados por él.
Los lenguajes como Java, C# y la mayoría de los lenguajes de secuencias de comandos tienen recolección de basura como parte del lenguaje para una mayor eficiencia.
Pero en lenguajes como C++, tenemos administración de memoria manual, lo que significa que el programador tiene que hacerlo manualmente usando comandos como “nuevo”, “eliminar” o algún algoritmo.
Gestión manual de memoria en C++
La asignación de memoria dinámica es un tipo de memoria asignada durante el tiempo de ejecución en el área de montón
. Una vez que dejamos de usar esa memoria, debe ser liberada; de lo contrario, podría provocar una pérdida de memoria.
La asignación y desasignación de memoria en C++ se realizan manualmente mediante comandos como nuevo
o eliminar
. La palabra clave nuevo
asigna la memoria dinámicamente desde el montón.
Una vez que se realiza el uso, usamos la palabra clave eliminar
para desasignar y borrar la memoria. Internamente llama al destructor
para destruir la memoria.
Por lo tanto, nuevo
siempre debe ir seguido del comando eliminar
para evitar pérdidas de memoria.
Código de ejemplo:
#include <bits/stdc++.h>
using namespace std;
int main() {
int *arr = new int[5]; // 5 blocks of memory allocated
if (!arr)
cout << "Memory allocation failed\n";
else {
for (int i = 0; i < 5; i++) arr[i] = i + 1;
cout << "Value stored in memory blocks ";
for (int i = 0; i < 5; i++) cout << arr[i] << " ";
}
delete[] arr; // deallocates the block of memory
}
Producción :
Value stored in memory blocks 1 2 3 4 5
Problemas con la gestión manual de la memoria en C++
Un problema importante es que podríamos olvidarnos de usar “eliminar”, lo que provocaría una pérdida de memoria. El segundo gran problema es cuando se trata de programas extensos en los que se produce una gran cantidad de asignación de memoria dinámica, es posible que desasignemos accidentalmente la memoria que ya está en uso.
Algoritmos para la recolección de basura
Podemos usar diferentes algoritmos de recolección de basura como “marcar y barrer”, “copiar” y “recuento de referencias” para que un programa, especialmente para lenguajes como C++, pueda tener simultáneamente recolección de basura y administración manual de memoria.
Un recuento de referencia está asociado con cada asignación de memoria dinámica en el algoritmo de recuento de referencia
. El recuento de referencias aumenta cuando se crea una nueva referencia y disminuye cuando se elimina una referencia.
Cuando este conteo llega a 0, significa que la memoria ya no está en uso y podemos liberarla.