Bienvenidos sean a este post, hoy veremos como imitar este modulo.
Uno de los mas importantes inconvenientes de C++ es que no tiene un administrador automatico de memoria y ocasionalmente podemos tener leaks de memoria, lo cual desencadena en errores de nuestros codigos. Si bien, hemos visto en los posts anteriores algunos de los llamados punteros inteligentes. Estos no evitan completamente estos leaks de memoria. Por esta razon, en otros lenguajes como C# o Java existe un modulo llamado Colector de basura. Este modulo independiente es usualmente incorporado en el entorno de ejecucion. El colector hace un seguimiento de todas las ubicaciones de los objetos en el codigo y los remueve una vez que no se usan mas. Se lo denomina de esta manera porque «recoge lo dejado por el programador».
En C++ se considera que esto no existe porque los programadores no dejan nada. Por ende, no es necesario un modulo como este. Los defensores de que no exista este modulo argumentan que es un lenguaje muy rapido, y la verdad el lenguaje puede sobrevivir sin el mismo.
En el caso de C#, este se compila dentro de una representación intermedia de código de bytes. La cual es interpretada y ejecutada por el entorno de ejecucion. El colector de basura es parte de este entorno y se encarga de hacer un seguimiento de la ubicacion de los objetos. En cambio, en C++ debemos llamar manualmente al operador delete para liberar el espacio en memoria incluso usando punteros inteligentes. Aqui lo importante es que a pesar de que los punteros inteligentes nos proveen algunas conductas semiautomaticas, estas actuan como si el programador aun es el encargado de eliminar dichos objetos en memoria.
El colector de basura se encarga de esto y usualmente lo hace en threads separados. Algunas de las tecnicas de implementacion de la coleccion de basura incluye la clasificacion de objetos por su duracion. Esta clasificacion hace que el colector visite los objetos y los libere de memoria cuando ya no son usados nunca mas. Para mejorar este proceso, los objetos con una duracion mas corta deberian ser visitados mas seguidos que el objeto de mayor duracion. Veamos el siguiente ejemplo:
class Recolector
{
public:
template <typename T>
static T* ubicar() {
T* ptr{new T()};
objetos[ptr] = true;
return ptr;
}
static void desubicar(T* p) {
if (objetos[p]) {
objetos[p] = false;
delete p;
}
}
private:
std::unordered_map<T*, bool> objetos;
};
Este es un ejemplo de colector de basura. Esta clase tendra dos metodos estaticos publicos para ubicar y desubicar los objetos en memoria y en la parte privada existe una propiedad llamada objetos. Esta propiedad sera un map donde la clave sera el puntero y e valor asociado de tipo booleano. Volviendo a los metodos, el llamado ubicar crea un nuevo puntero del tipo generico y este lo usa como clave, y le asignamos un valor true para indicar que esta activo y ubicado, y devolvemos este puntero. En el caso de desubicar recibimos un puntero y lo pasamos como clave a objetos y lo evaluamos con un condicional. Si existe lo establecemos como false en el map y eliminamos al puntero. Esto no solo eliminara el espacio en memoria sino que tambien dejamos de hacerle seguimiento. Para implementarlo, se deberia usar de la siguiente manera:
int* ptr = Recolector::ubicar<int>();
*ptr = 42;
Recolector::desubicar(ptr);
Primero definimos un puntero y en este usaremos al metodo ubicar. Podemos usarlo de esta manera porque es estatico, luego le asignamos un valor para finalmente usar a desubicar y eliminarlo. Si lo analizamos, esta clase nos dificulta mas que el simple uso de punteros inteligentes. Y tal como mencionamos en otro post y en este, no es necesario un colector de basura porque los punteros inteligentes son bastante eficientes en esa tarea.
En resumen, hoy hemos visto colector de basura, que es, para que sirve, una forma e implementarlo, aunque no sea necesario, y un ejemplo para verlo en accion. Espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donatión
It’s for site maintenance, thanks!
$1.50
