C++ Garbage Collection, usando la librería Boost
Wednesday, September 1st, 2010En C++ podemos utilizar la librería boost para tener una funcionalidad similar al “garbage collector” de Java o .NET.
En concreto, podemos usar los smart pointers provistos por esta librería para “automatizar” la liberación de memoria en nuestra aplicación, ayudando a evitar los memory leaks.
Veamos un ejemplo de código:
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <vector>
// Just a simple class
class Foo{
public:
Foo(){ }
~Foo(){
std::cout << "Destructing. " << (int)this << std::endl;
}
};
// Make shorthand to cut some typing
typedef boost::shared_ptr<Foo> FooPtr;
// this functions allocates memory for an object, return a shared_ptr to it and forgets about it.
FooPtr CreateFoo(){
FooPtr fp(new Foo);
return fp;
}
int main(int argc, char** argv){
std::vector<FooPtr> foos;
foos.push_back(CreateFoo());
foos.push_back(CreateFoo());
FooPtr temp = foos[1]; // extract the second object
std::cout << "clearing vector.." << std::endl;
foos.clear(); // the first object will be deleted here, but not the second, since it has a reference still in scope.
std::cout << "ending program.." << std::endl;
// main returns and the final object goes out of scope and is automatically destroyed.
return 0;
}
El código muestra cómo usar boost::shared_ptr, junto con los contenedores de la STL. Nótese que no se ha utilizado ningún “delete”.
Este objeto, shared_ptr, puede ser utilizado como “envoltorio” de los punteros a objetos, de manera que se haga un seguimiento de los referencias a estos. Una vez que todas las referencias al objeto han sido eliminadas, o han salido de su ámbito, se libera automáticamente la memoria reservada para el objeto.
Por supuesto, esta “recolección de basura” sólo es válida para los objetos creados en nuestro código usando el puntero inteligente. Cualquier objeto creado en librerías de terceros, debe ser convenientemente manejado para evitar las fugas de memoria.
Vía | http://www.libzter.com